zoukankan      html  css  js  c++  java
  • Log4Net 日志配置

    前述

      园子里有许多人对log4net这款开源的日志记录控件有很多介绍。在这里个人再做一次总结,希望对以后有所帮助,需要的时候可以直接使用,减 少查阅资料的时间。利用log4net可以方便地将日志信息记录到文件、控制台、Windows事件日志和数据库,并且我们还可以记载控制要记载的日志级 别,可以记载的日志类别包括:FATAL(致命错误)、ERROR(一般错误)、WARN(警告)、INFO(一般信息)、DEBUG(调试信息)。 log4net 有四种主要的组件,分别是Logger(记录器), Repository(库), Appender(附着器)以及 Layout(布局).

    准备工作:

    1.下载log4net.dll 下载地址[http://logging.apache.org/log4net/download_log4net.cgi]

    下载文件:log4net-1.2.13-bin-newkey.zip。 解压选择对应的net版本找到log4net.dll。

    2.在项目中引用log4net.dll。

    实例代码

    准备工作完成后我们来看下实例代码 ,首先在项目中创建一个文件夹LogConfig。把有关log4net的一些配置文件和类都放在这个文件夹里面。

    WEB网站为例,在项目LogConfig文件夹中创建Log4Net.config配置文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
     <configSections>
      <!--添加自定义节点:log4net type:解析类名,程序集名(log4net.dll)-->
      <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
     </configSections>
     
     <log4net>
      <!--定义输出到文件中-->
      <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
       <!--定义文件存放位置-->
       <file value="C:/log4net/"/>
       <!--是否追加到文件,默认为true,通常无需设置-->
       <appendToFile value="true"/>
       <RollingStyle value="Date"/>
       <!--日期的格式,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
       <DatePattern value="INFO_yyyyMMdd".log"" />
       <!--日志文件名是否为静态-->
       <StaticLogFileName value="false"/>
       <!--多线程时采用最小锁定-->
       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
       <!--布局(向用户显示最后经过格式化的输出信息)-->
       <layout type="log4net.Layout.PatternLayout">
        <!--
          %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
          %n(new line):换行
          %d(datetime):输出当前语句运行的时刻
          %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
          %t(thread id):当前语句所在的线程ID
          %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
          %c(class):当前日志对象的名称,例如:
          %L:输出语句所在的行号
          %F:输出语句所在的文件名
          %-数字:表示该项的最小长度,如果不够,则用空格填充
         -->
        <Header value="[Header]
    "/>
        <Footer value="[Footer]
    "/>
        <!--正文-->
        <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
       </layout>
      </appender>
     
      <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">
       <file value="C:/log4net/"/>
       <appendToFile value="true"/>
       <RollingStyle value="Date"/>
       <DatePattern value="ERROR_yyyyMMdd".log"" />
       <StaticLogFileName value="false"/>
       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
       <layout type="log4net.Layout.PatternLayout">
        <Header value="[Header]
    "/>
        <Footer value="[Footer]
    "/>
        <!--正文-->
        <ConversionPattern value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 出错类:%logger property:[%property{NDC}] - 错误描述:%message%newline" />
       </layout>
      </appender>
     
      <root>
       <level value="DEBUG"/>
       <appender-ref ref="Log4Net_ERROR" />
     
       <level value="INFO"/>
       <appender-ref ref="Log4Net_INFO" />
      </root>
     
     </log4net>
     
    </configuration>

    配置文件写完后我们在来写一个Helper类。同样在项目中创建一个名为LogHelper.cs的类文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    using log4net;
    using System;
    using System.Collections.Concurrent;
    using System.Collections.Generic;
     
    //指定log4net使用的config文件来读取配置信息
    [assembly: log4net.Config.XmlConfigurator(ConfigFile = @"LogConfigLog4Net.config", Watch = true)]
    namespace Project.Log4.Net.LogConfig
    {
      /// <summary>
      /// 日志帮助类
      /// </summary>
      public class LogHelper
      {
        private static readonly ConcurrentDictionary<Type, ILog> _loggers = new ConcurrentDictionary<Type, ILog>();
     
        /// <summary>
        /// 获取记录器
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        private static ILog GetLogger(Type source)
        {
          if (_loggers.ContainsKey(source))
          {
            return _loggers[source];
          }
          else
          {
            ILog logger = LogManager.GetLogger(source);
            _loggers.TryAdd(source, logger);
            return logger;
          }
        }
     
        /* Log a message object */
     
        /// <summary>
        /// 调试信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Debug(object source, string message)
        {
          Debug(source.GetType(), message);
        }
     
        /// <summary>
        /// 调试信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="ps"></param>
        public static void Debug(object source, string message, params object[] ps)
        {
          Debug(source.GetType(), string.Format(message, ps));
        }
     
        /// <summary>
        /// 调试信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Debug(Type source, string message)
        {
          ILog logger = GetLogger(source);
          if (logger.IsDebugEnabled)
            logger.Debug(message);
        }
     
        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Info(object source, object message)
        {
          Info(source.GetType(), message);
        }
     
        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Info(Type source, object message)
        {
          ILog logger = GetLogger(source);
          if (logger.IsInfoEnabled)
            logger.Info(message);
        }
     
        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Warn(object source, object message)
        {
          Warn(source.GetType(), message);
        }
     
        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Warn(Type source, object message)
        {
          ILog logger = GetLogger(source);
          if (logger.IsWarnEnabled)
            logger.Warn(message);
        }
     
        /// <summary>
        /// 错误信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Error(object source, object message)
        {
          Error(source.GetType(), message);
        }
     
        /// <summary>
        /// 错误信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Error(Type source, object message)
        {
          ILog logger = GetLogger(source);
          if (logger.IsErrorEnabled)
            logger.Error(message);
        }
     
        /// <summary>
        /// 失败信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Fatal(object source, object message)
        {
          Fatal(source.GetType(), message);
        }
     
        /// <summary>
        /// 失败信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        public static void Fatal(Type source, object message)
        {
          ILog logger = GetLogger(source);
          if (logger.IsFatalEnabled)
            logger.Fatal(message);
        }
     
        /* Log a message object and exception */
     
        /// <summary>
        /// 调试信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Debug(object source, object message, Exception exception)
        {
          Debug(source.GetType(), message, exception);
        }
     
        /// <summary>
        /// 调试信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Debug(Type source, object message, Exception exception)
        {
          GetLogger(source).Debug(message, exception);
        }
     
        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Info(object source, object message, Exception exception)
        {
          Info(source.GetType(), message, exception);
        }
     
        /// <summary>
        /// 关键信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Info(Type source, object message, Exception exception)
        {
          GetLogger(source).Info(message, exception);
        }
     
        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Warn(object source, object message, Exception exception)
        {
          Warn(source.GetType(), message, exception);
        }
     
        /// <summary>
        /// 警告信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Warn(Type source, object message, Exception exception)
        {
          GetLogger(source).Warn(message, exception);
        }
     
        /// <summary>
        /// 错误信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Error(object source, object message, Exception exception)
        {
          Error(source.GetType(), message, exception);
        }
     
        /// <summary>
        /// 错误信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Error(Type source, object message, Exception exception)
        {
          GetLogger(source).Error(message, exception);
        }
     
        /// <summary>
        /// 失败信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Fatal(object source, object message, Exception exception)
        {
          Fatal(source.GetType(), message, exception);
        }
     
        /// <summary>
        /// 失败信息
        /// </summary>
        /// <param name="source"></param>
        /// <param name="message"></param>
        /// <param name="exception"></param>
        public static void Fatal(Type source, object message, Exception exception)
        {
          GetLogger(source).Fatal(message, exception);
        }
      }
     
    }

    配置和Helper类都有了..现在来看看调用方法。在项目中创建一个index.aspx页面

    1
    2
    3
    4
    5
    LogHelper.Debug(this, "Debug");
    LogHelper.Error(this, "Error");
    LogHelper.Fatal(this, "Fatal");
    LogHelper.Info(this, "Info");
    LogHelper.Warn(this, "Warn");

    日志生成格式[每天一个文件]:


    参数说明

    Log4Net.config是配置日志输出参数文件。在这个文件中可以到看很多配置节点,大体可以分为二个大 类<configSections>...</configSections> 和 <log4net>...</log4net>。我们来看看这些节点都是啥意思。

    1:<configSections>..</configSections>:申明自定义节点log4net解析的类名和程序集名(log4net.dll)。
    2:<log4net>..</log4net>:使用log4net的配置信息都在这里设置。来重点看看都有那些设置信息,这个大节点整体也可以分为二类。

    2.1:定义输出信息设置节点<appender></appender>。
    2.2:定义日志的输出媒介<root></root>。

    配置的总体结构就是这样,下面来看一些详细内容。

    appender:决定日志输出的方式(可设置多个节点,如对INFO,ERROR等设置不同的输出方式)。

    主要包括已下几种:

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

    从上面提供的方式中可以看出能输出文件、控制台、Windows事件日志和数据库。这个可根据实际情况选择。

    复制代码 代码如下:

    <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
    ...
    </appender>

    这里配置的name(“Log4Net_INFO”)会在定义日志的输出媒介中使用到。name可任意设置。

    在appender 节点中还会配置一些文件存放的地址,日志个数等信息。这些在实例代码中都在体现,这里不做说明。我们在来看看日志最后输出呈现的布局设置信息。

    1
    2
    3
    4
    5
    6
    7
    8
    <layout type="log4net.Layout.PatternLayout">
        <!--头-->
        <Header value="[Header]"/>
        <!--脚注-->
        <Footer value="[Footer]"/>
        <!--正文-->
        <ConversionPattern value="%d [%t] %-5p %c [%x] - %m%n" />
    </layout>

    这里配置的信息最终是日志打印出来的样式。我们可以看到这里可以设置内容头Header和尾Footer。正文ConversionPattern。在正文中有出现有 %d [%t]这些都是啥意思了表示什么。这里有一个对照表可提供参考:

    %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息
    %n(new line):换行
    %d(datetime):输出当前语句运行的时刻
    %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数
    %t(thread id):当前语句所在的线程ID
    %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等
    %c(class):当前日志对象的名称,例如:
    %L:输出语句所在的行号
    %F:输出语句所在的文件名
    %-数字:表示该项的最小长度,如果不够,则用空格填充

    配置的基本也就这些。下就是root的配置说明 。

    root:

    对设置输出的方式进行指定。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <root>
       <!--批定DEBUG输出的文件形式记录日志-->
       <level value="DEBUG"/>
       <appender-ref ref="Log4Net_ERROR" />
      
      <!--批定INFO输出的文件形式记录日志-->
       <level value="INFO"/>
       <appender-ref ref="Log4Net_INFO" />
    </root>

    控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF
    比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录
    如果没有定义LEVEL的值,则缺省为DEBUG

  • 相关阅读:
    使用JSONPath
    JSON 返回值JSONPath Syntax
    IntelliJ IDEA 打包Maven 构建的 Java 项目
    JMeter(7) 优化判断返回类型和返回值
    Windows copy
    Windows del
    Windows exit
    Windows netsh
    Windows start
    Windows taskkill
  • 原文地址:https://www.cnblogs.com/xiaocandou/p/4602999.html
Copyright © 2011-2022 走看看