【C#】快速上手 log4net,在 C# 中输出完整日志文件

感谢 TurboAI对本博客的的大力赞助。 创作不易,如果您觉得有帮助,请 支持LIncol29! 为了让我能够继续创作更好的内容,你也可以选择订阅博客的 VIP ,包年VIP仅需10元/年,所有VIP内容免费观看

log4net介绍

Log4net是一个功能强大的日志记录库,广泛用于C#开发中。它允许开发者灵活地记录应用程序的运行信息,有助于调试和性能监控。使用Log4net的主要原因包括:

  1. 灵活配置:支持XML和代码配置,可以根据需求调整日志级别和输出格式。
  2. 多种输出方式:可以将日志输出到控制台、文件、数据库等多种目标,方便信息收集。
  3. 性能优化:异步记录和日志级别管理,确保应用程序性能不受影响。

引用log4net.dll文件

项目引用dll文件,或者自己打包log4net 。

  • 在Nuget项目包管理里面添加 log4net
  • 直接使用 lincol提供的 dll文件,地址如下:log4net.dll

添加log4net.config配置文件

在项目添加程序配置文件log4net.config

文件复制到输出目录要选择:设置为“始终复制”或“如果更新则复制”。这样子才可以让软件找到此文件。

img

log4net.config配置如下,直接 copy 即可

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <log4net>
        <!--错误日志类-->
        <logger name="logerror">
            <!--日志类的名字-->
            <level value="ALL" />
            <!--定义记录的日志级别-->
            <appender-ref ref="ErrorAppender" />
            <!--记录到哪个介质中去-->
        </logger>
        <!--信息日志类-->
        <logger name="loginfo">
            <level value="ALL" />
            <appender-ref ref="InfoAppender" />
        </logger>
        <!--错误日志附加介质-->
        <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
            <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是,指定使用哪种介质-->
            <param name="File" value="Log\\LogError\\" />

            <!--日志输出到exe程序这个相对目录下-->
            <param name="AppendToFile" value="true" />
            <!--输出的日志不会覆盖以前的信息-->
            <param name="MaxSizeRollBackups" value="100" />
            <!--备份文件的个数-->
            <param name="MaxFileSize" value="10240" />
            <!--当个日志文件的最大大小-->
            <param name="StaticLogFileName" value="false" />
            <!--是否使用静态文件名-->
            <param name="DatePattern" value="yyyyMMdd&quot;.htm&quot;" />
            <!--日志文件名-->
            <param name="RollingStyle" value="Date" />
            <!--文件创建的方式,这里是以Date方式创建-->
            <!--错误日志布局-->
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="&lt;HR COLOR=red&gt;%n异常时间:%d [%t] &lt;BR&gt;%n异常级别:%-5p &lt;BR&gt;%n异 常 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  />
            </layout>
        </appender>
        <!--信息日志附加介质-->
        <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="Log\\LogInfo\\" />
            <param name="AppendToFile" value="true" />
            <param name="MaxFileSize" value="10240" />
            <param name="MaxSizeRollBackups" value="100" />
            <param name="StaticLogFileName" value="false" />
            <param name="DatePattern" value="yyyyMMdd&quot;.htm&quot;" />
            <param name="RollingStyle" value="Date" />
            <!--信息日志布局-->
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="&lt;HR COLOR=blue&gt;%n日志时间:%d [%t] &lt;BR&gt;%n日志级别:%-5p &lt;BR&gt;%n日 志 类:%c [%x] &lt;BR&gt;%n%m &lt;BR&gt;%n &lt;HR Size=1&gt;"  />
            </layout>
        </appender>
    </log4net>
</configuration>

使用LogHelper类

public  class LogHelper
{
    public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
    public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");

    public static void LogErr(string info)
    {
        logerror.Error(info);
    }

    public static void LogTrace(string info)
    {
        loginfo.Debug("trace: " + info);

    }
    public static void WriteLog(string info)
    {
        if (loginfo.IsInfoEnabled)
        {
            loginfo.Info(info);
        }
    }

    public static void SetConfig()
    {
        var path = new FileInfo("log4net.config");
        //Console.Write(path);
        log4net.Config.XmlConfigurator.Configure(path);
        logerror.Info("Enter application.");
        loginfo.Info("Enter application.");
    }
    /// <summary>
    /// 删除N天之前的日志
    /// </summary>
    /// <param name="n"></param>
    public static void DeleteLogBeforeN(int n)
    {
        DateTime nowTime = DateTime.Now;
        string[] pcfiles = Directory.GetFiles(System.Environment.CurrentDirectory + @".\\Log\\LogInfo");


        string[] robotfiles = Directory.GetFiles(System.Environment.CurrentDirectory + @".\\IPCLog");

        foreach (string file in pcfiles)
        {
            FileInfo fileInfo = new FileInfo(file);
            string pcdata = fileInfo.Name.Substring(0, 8);
            DateTime filedate = DateTime.ParseExact(pcdata, "yyyyMMdd", null);
            TimeSpan t = DateTime.Now - filedate;  //当前时间  减去 文件创建时间
            int day = t.Days;
            if (day > n)   //保存的时间,单位:天
            {
                if (IsOccupy(fileInfo.FullName)) //判断文件是否被占用
                {
                    System.IO.File.Delete(fileInfo.FullName); //删除文件
                }
                else
                {
                    LogHelper.loginfo.Error("当前日志文件被占用,无法操作!");
                }
            }
        }

        foreach (string file in robotfiles)
        {
            FileInfo fileInfo = new FileInfo(file);
            string robotdata = fileInfo.Name.Substring(4, 10);
            DateTime filedate = DateTime.ParseExact(robotdata, "yyyy-MM-dd", null);
            TimeSpan t = DateTime.Now - filedate;  //当前时间  减去 文件创建时间
            int day = t.Days;
            if (day > n)   //保存的时间,单位:天
            {
                if (IsOccupy(fileInfo.FullName)) //判断文件是否被占用
                {
                    System.IO.File.Delete(fileInfo.FullName); //删除文件
                }
                else
                {
                    LogHelper.loginfo.Error("文件被占用,无法操作!");
                }
            }
        }

    }

    [DllImport("kernel32.dll")]
    public static extern IntPtr _lopen(string lpPathName, int iReadWrite);

    [DllImport("kernel32.dll")]
    public static extern bool CloseHandle(IntPtr hObject);

    public const int OF_READWRITE = 2;
    public const int OF_SHARE_DENY_NONE = 0x40;
    public static readonly IntPtr HFILE_ERROR = new IntPtr(-1);



    private static bool IsOccupy(string file)
    {
        bool result = true; //默认状态此文件未被占用
        try
        {
            //string vFileName = @"c:\temp\temp.bmp";
            string vFileName = file;
            if (!System.IO.File.Exists(vFileName))
            {
                //Logger.Info("文件都不存在!");
                result = false;
            }
            IntPtr vHandle = _lopen(vFileName, OF_READWRITE | OF_SHARE_DENY_NONE);
            if (vHandle == HFILE_ERROR)
            {
                LogHelper.loginfo.Error("文件被占用!");
                result = false;
            }
            CloseHandle(vHandle);
        }
        catch (Exception err)
        {
            result = false;
            LogHelper.loginfo.Error(err);
        }
        return result;
    }


    public static void WriteLog(string info, Exception ex)
    {
        if (logerror.IsErrorEnabled)
        {
            logerror.Error(info, ex);
        }
    }

主窗口Load事件加入初始化日志

在想使用的地方(建议主窗口)。窗口Load事件加入此代码: LogHelper.SetConfig();初始化配置文件

调用LogHelper方法

建议直接使用 loginfo 或者 logerror的方法

public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");

例如直接使用

LogHelper.loginfo.Debug("软件关闭!!!");

PixPin_2025-04-25_17-16-24

创作不易,如果您觉得有帮助,请支持LIncol29!
如有需要,请至网站地图学习本博客的教程
博客订阅:通过RSS或关注公众号[Lincol的编程世界] | 广告招租与合作请留言
本文链接:https://www.lincol29.cn/use-log4net
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0协议转载请注明文章地址及作者哦~

评论

  1. Linux Chrome
    5 天前
    2025-4-26 9:05:21

    假设每个日志文件每天10MB 100天就是1GB 如果运行几年 日志会占据很多空间 而且没压缩的文件体积大 备份和传输都很麻烦哦

    • 博主
      刘郎
      Windows Chrome
      5 天前
      2025-4-26 9:13:24

      LogHelper里面有DeleteLogBeforeN,设置时间自动清理就可以啦

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇