• C#使用Log4.net记录日子文件


    C#使用Log4.net记录日子文件

    一、简介

    1.1 Log4.net优点

    几乎所有的大型应用都会有自己的用于跟踪调试的API。因为一旦程序被部署以后,就不太可能再利用专门的调试工具了。然而一个管理员可能需要有一套强大的日志系统来诊断和修复配置上的问题。经验表明,日志记录往往是软件开发周期中的重要组成部分。它具有以下几个优点:
     1.它可以提供应用程序运行时的精确环境,可供开发人员尽快找到应用程序中的Bug;
     2.一旦在程序中加入了Log 输出代码,程序运行过程中就能生成并输出日志信息而无需人工干预。
     3.另外,日志信息可以输出到不同的地方(控制台,文件等)以备以后研究之用。
     4.Log4net就是为这样一个目的设计的,用于.NET开发环境的日志记录包。

    1.2 Log4.net结构

     log4net有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局)。

    1.3 日志记录方式

     1.AdoNetAppender:利用ADO.NET记录到数据库的日志。
     2.AnsiColorTerminalAppender:在ANSI 窗口终端写下高亮度的日志事件。
     3.AspNetTraceAppender:能用asp.net中Trace的方式查看记录的日志。
     4.BufferingForwardingAppender:在输出到子Appenders之前先缓存日志事件。
     5.ConsoleAppender:将日志输出到控制台。
     6.EventLogAppender:将日志写到Windows Event Log.
     7.FileAppender:将日志写到文件中。
     8.LocalSyslogAppender:将日志写到local syslog service (仅用于UNIX环境下).
     9.MemoryAppender:将日志存到内存缓冲区。
     10.NetSendAppender:将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
     11.RemoteSyslogAppender:通过UDP网络协议将日志写到Remote syslog service。
     12.RemotingAppender:通过.NET Remoting将日志写到远程接收端。
     13.RollingFileAppender:将日志以回滚文件的形式写到文件中。
     14.SmtpAppender:将日志写到邮件中。
     15.TraceAppender:将日志写到.NET trace 系统。
     16.UdpAppender:将日志connectionless UDP datagrams的形式送到远程宿主或以UdpClient的形式广播。

    1.4 参数

     1.%m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
     2.%n(new line):换行
     3.%d(datetime):输出当前语句运行的时刻
     4.%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
     5.%t(thread id):当前语句所在的线程ID
     6.%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
     7.%c(class):当前日志对象的名称,例如:
     8.%f(file):输出语句所在的文件名。
     9.%l(line):输出语句所在的行号。
     10.%数字:表示该项的最小长度,如果不够,则用空格填充,如“%-5level”表示level的最小宽度是5个字符,如果实际长度不够5个字符则以空格填充。

    二、定义配置文件

     1.要使用log4.net记录日志功能,就要建立在Web或者Winform程式中的AssemblyInfo.cs文件中添加如下一语句,这句话的意思是log4net会自动寻找配置文件log4net.config,从而获得并加载其中的配置信息。注意此处的ConfigFile要与项目中的.Config文件名称保持一致。这个配置文件名称在建立的项目下面默认为App.config或Web.config。

    ConfigFile要与项目中的.Config文件名称一致

    [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

     2.要使用log4net,首先要在config文件的<configSections>节点中增加配置(如果没有这个节点请手动增加),如下:

     <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler"/>
      </configSections>

     3.除此之外,还要在顶级节点<configuration>下增加<log4net>子节点。在<log4net>节点下就可以增加<appender>子节点,每个<appender>子节点代表一种记录日志的方式(仅在这里配置了不代表启用了)。

      <log4net>
        <!-- name属性指定其名称,type则是log4net.Appender命名空间的一个类的名称,意思是指定使用哪种介质-->
        <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
          <file value="E:Log\"/>
          <!-- 输出到什么目录,此处日志记录没有存放项目文件-->
          <appendToFile value="true"/>
          <!-- 是否到追加到文件中-->
          <rollingStyle value="Date"/>
          <!-- 文件创建方式,以日期的方式记录-->
          <datePattern value="yyyy-MM-dd&quot;.txt&quot;"/>
          <!-- 文件格式,每天生成一个文件-->
          <staticLogFileName value="false"/>
          <!--否采用静态文件名,文件名是否唯一-->
          <layout type="log4net.Layout.PatternLayout">
            <!---日志内容布局-->
            <param name="ConversionPattern" value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline"/>
            <!--下面的输出首尾样式-->
            <param name="Header" value="&#xA;----------------------header--------------------------&#xA;"/>
            <param name="Footer" value="&#xA;----------------------footer--------------------------&#xA;"/>
          </layout>
        </appender>
    
        <!--另一种Appender--> 
        <!--每个<appender>子节点代表一种记录日志的方式(仅在这里配置了不代表启用了)-->
        <appender name="DateFileInfoAppender" type="log4net.Appender.RollingFileAppender">
          <file value="E:Log\log.txt"/>
           <!--输出到什么文件-->
          <appendToFile value="true"/>
           <!--是否到附加到文件中-->
          <rollingStyle value="Size" />
          <maxSizeRollBackups value="10"/>
          <!--日志文件的最大个数-->
          <maximumFileSize value="10MB"/>
           <!--单个日志文件最大的大小-->
          <staticLogFileName value="true"/>
          <!--否采用静态文件名,文件名是否唯一-->
          <layout type="log4net.Layout.PatternLayout">
            <!--日志内容布局-->
            <param name="ConversionPattern" value="%date [%thread] (%file:%line) %-5level %logger [%property{NDC}] - %message%newline"/>
          </layout>
        </appender>
    
        <!--定义日志的输出媒介,下面定义日志以几种种方式输出。也可以下面的按照一种类型或其他类型输出。-->
        <root>
          <!--文件形式记录日志-->
          <appender-ref ref="LogFileAppender" />
    
          <!--控制台控制显示日志-->
          <!--<appender-ref ref="ConsoleAppender" />-->
          <!--Windows事件日志-->
          <!--<appender-ref ref="EventLogAppender" />-->
          <!--SQLite事件日志-->
          <!--<appender-ref ref="AdoNetAppender_SQLite" />-->
          <!--RollingFileAppender事件日志-->
          <!--<appender-ref ref="RollingFileAppender" />-->
          <!--RollingFileAppender事件日志,每天一个日志-->
          <!--<appender-ref ref="RollingLogFileAppender_DateFormat" />-->
          <!-- 如果不启用相应的日志记录,可以通过这种方式注释掉  
            <appender-ref ref="AdoNetAppender_Access" /> 
      -->
        </root>
      </log4net>

     4.两点注意事项

      4.1 第一个:在点击配置文件中,把log4.config 文件属性中的下图ITEM改为:赋值到输出目录->如果较新则复制。

      4.2 第二个:在上面的配置文件中, <appender-ref ref="LogFileAppender" />和<appender name="DateFileInfoAppender" 的值需要保持一致

    三、在代码中使用log4.net记录日志

    代码:

    namespace log4netDemo1
    {
        class Program
        {
            public static class TestClass1
            {
                private static readonly ILog log = LogManager.GetLogger(typeof(TestClass1));
    
                public static void TestLog()
                {
                    for (int i = 0; i < 3; ++i)
                    {
                        log.Info(string.Format("Log info {0}", i));
                        log.Debug(string.Format("Log debug {0}", i));
                    }
                }
            }
    
            public static class TestClass2
            {
                private static readonly ILog log = LogManager.GetLogger(typeof(TestClass2));
    
                public static void TestLog()
                {
                    Random random = new Random();
                    for (int i = 0; i < 3; i++)
                    {
                        //创建日志记录组件实例  
                        //ILog log = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
    
                        ILog log = log4net.LogManager.GetLogger(typeof(TestClass2));
                        //记录错误日志  
                        log.Error("error", new Exception("在這裡發生了一個異常,Error Number:" + random.Next()));
                        //记录严重错误  
                        log.Fatal("fatal", new Exception("在這裡發生了一個致命的錯誤,Exception Id:" + random.Next()));
                        //记录一般信息  
                        log.Info("提示:系統正在運行");
                        //记录调试信息  
                        log.Debug("調試信息:debug");
                        //记录警告信息  
                        log.Warn("警告信息:warn");
                    }
                }
            }
            static void Main(string[] args)
            {
    
                try
                {
                    TestClass1.TestLog();
                    TestClass2.TestLog();
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

    输出日志文件记录样式:

    ----------------------header--------------------------
    //TestClass1
    2021-05-27 14:54:31,006 [9] (D:Winform控制台log4netDemo1Program.cs:21) INFO log4netDemo1.Program+TestClass1 [(null)] - Log info 0 2021-05-27 14:54:31,026 [9] (D:Winform控制台log4netDemo1Program.cs:22) DEBUG log4netDemo1.Program+TestClass1 [(null)] - Log debug 0 2021-05-27 14:54:31,027 [9] (D:Winform控制台log4netDemo1Program.cs:21) INFO log4netDemo1.Program+TestClass1 [(null)] - Log info 1 2021-05-27 14:54:31,027 [9] (D:Winform控制台log4netDemo1Program.cs:22) DEBUG log4netDemo1.Program+TestClass1 [(null)] - Log debug 1 2021-05-27 14:54:31,242 [9] (D:Winform控制台log4netDemo1Program.cs:21) INFO log4netDemo1.Program+TestClass1 [(null)] - Log info 2 2021-05-27 14:54:31,243 [9] (D:Winform控制台log4netDemo1Program.cs:22) DEBUG log4netDemo1.Program+TestClass1 [(null)] - Log debug 2 2021-05-27 14:54:31,243 [9] (D:Winform控制台log4netDemo1Program.cs:41) ERROR log4netDemo1.Program+TestClass2 [(null)] - error

    //TestClass2 System.Exception: 在這裡發生了一個異常,Error Number:1406401970 2021-05-27 14:54:31,245 [9] (D:Winform控制台log4netDemo1Program.cs:43) FATAL log4netDemo1.Program+TestClass2 [(null)] - fatal System.Exception: 在這裡發生了一個致命的錯誤,Exception Id:1970620894 2021-05-27 14:54:31,245 [9] (D:Winform控制台log4netDemo1Program.cs:45) INFO log4netDemo1.Program+TestClass2 [(null)] - 提示:系統正在運行 2021-05-27 14:54:31,245 [9] (D:Winform控制台log4netDemo1Program.cs:47) DEBUG log4netDemo1.Program+TestClass2 [(null)] - 調試信息:debug 2021-05-27 14:54:31,246 [9] (D:Winform控制台log4netDemo1Program.cs:49) WARN log4netDemo1.Program+TestClass2 [(null)] - 警告信息:warn 2021-05-27 14:54:31,246 [9] (D:Winform控制台log4netDemo1Program.cs:41) ERROR log4netDemo1.Program+TestClass2 [(null)] - error System.Exception: 在這裡發生了一個異常,Error Number:875602933 2021-05-27 14:54:31,246 [9] (D:Winform控制台log4netDemo1Program.cs:43) FATAL log4netDemo1.Program+TestClass2 [(null)] - fatal System.Exception: 在這裡發生了一個致命的錯誤,Exception Id:2141773062 2021-05-27 14:54:31,246 [9] (D:Winform控制台log4netDemo1Program.cs:45) INFO log4netDemo1.Program+TestClass2 [(null)] - 提示:系統正在運行 2021-05-27 14:54:31,247 [9] (D:Winform控制台log4netDemo1Program.cs:47) DEBUG log4netDemo1.Program+TestClass2 [(null)] - 調試信息:debug 2021-05-27 14:54:31,247 [9] (D:Winform控制台log4netDemo1Program.cs:49) WARN log4netDemo1.Program+TestClass2 [(null)] - 警告信息:warn 2021-05-27 14:54:31,247 [9] (D:Winform控制台log4netDemo1Program.cs:41) ERROR log4netDemo1.Program+TestClass2 [(null)] - error System.Exception: 在這裡發生了一個異常,Error Number:128221959 2021-05-27 14:54:31,247 [9] (D:Winform控制台log4netDemo1Program.cs:43) FATAL log4netDemo1.Program+TestClass2 [(null)] - fatal System.Exception: 在這裡發生了一個致命的錯誤,Exception Id:1256294856 2021-05-27 14:54:31,247 [9] (D:Winform控制台log4netDemo1Program.cs:45) INFO log4netDemo1.Program+TestClass2 [(null)] - 提示:系統正在運行 2021-05-27 14:54:31,248 [9] (D:Winform控制台log4netDemo1Program.cs:47) DEBUG log4netDemo1.Program+TestClass2 [(null)] - 調試信息:debug 2021-05-27 14:54:31,248 [9] (D:Winform控制台log4netDemo1Program.cs:49) WARN log4netDemo1.Program+TestClass2 [(null)] - 警告信息:warn ----------------------footer--------------------------

    技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
    我创建了一个.NET开发交流群,用于分享学习心得和讨论相关技术难题。欢迎有兴趣的小伙伴扫码入群,相互学习!

  • 相关阅读:
    IOS中彻底删除mysql方法
    (iOS)Storyboard/xib小技巧
    (iOS)关于GCD死锁的问题
    android-通知Notification
    android-多线程
    android-服务Service
    android-OptionMenu
    android-SQLite 和 Content
    android-数据持久化
    Russia
  • 原文地址:https://www.cnblogs.com/wml-it/p/14817122.html
Copyright © 2020-2023  润新知