zoukankan      html  css  js  c++  java
  • Log4Net在.NET Fromework和.NET Core中的使用

      本文讨论的是在都需要使用Log4Net的前提下,因为.NET Core已经内置了日志服务,不使用Log4Net也是可以看到日志的.

      一、区别

      相同:

      1,都需要引用log4net.dll。

      不同:

      1,需要格式化日志输出方式的,它们中的Log4Net.config配置文件格式是不同的。

      2,.NET Core还需要引用Microsoft.Extensions.Logging.Log4Net.AspNetCore.dll。

      3,使用方式不同,.NET Framework一般是需要借助帮助类库的,.NET Core是可以直接使用依赖注入,也可以使用帮助类库。

      二、使用方式

      1,.NET Framework

      1 using log4net;
      2 using System;
      3 using System.Collections.Concurrent;
      4 using System.IO;
      5 using System.Reflection;
      6 using System.Xml;
      7 
      8 namespace MS.Quality.Component.Utility
      9 {
     10     /// <summary>
     11     /// 日志帮助类
     12     /// </summary>
     13     public class Log4NetUtility
     14     {
     15         private static readonly ConcurrentDictionary<Type, ILog> _loggers = new ConcurrentDictionary<Type, ILog>();
     16         /// <summary>
     17         /// 获取记录器
     18         /// </summary>
     19         /// <param name="source"></param>
     20         /// <returns></returns>
     21         private static ILog GetLogger(Type source)
     22         {
     23             if (_loggers.ContainsKey(source))
     24             {
     25                 return _loggers[source];
     26             }
     27             else
     28             {
     29                 ILog logger = LogManager.GetLogger(source);
     30                 SetLog4NetConfiguration();
     31                 _loggers.TryAdd(source, logger);
     32                 return logger;
     33             }
     34         }
     35 
     36         /// <summary>
     37         /// 调试信息
     38         /// </summary>
     39         /// <param name="source"></param>
     40         /// <param name="message"></param>
     41         public static void Debug(object source, string message)
     42         {
     43             Debug(source.GetType(), message);
     44         }
     45 
     46         /// <summary>
     47         /// 调试信息
     48         /// </summary>
     49         /// <param name="source"></param>
     50         /// <param name="message"></param>
     51         /// <param name="ps"></param>
     52         public static void Debug(object source, string message, params object[] ps)
     53         {
     54             Debug(source.GetType(), string.Format(message, ps));
     55         }
     56 
     57         /// <summary>
     58         /// 调试信息
     59         /// </summary>
     60         /// <param name="source"></param>
     61         /// <param name="message"></param>
     62         public static void Debug(Type source, string message)
     63         {
     64             ILog logger = GetLogger(source);
     65             if (logger.IsDebugEnabled)
     66                 logger.Debug(message);
     67         }
     68         /// <summary>
     69         /// 关键信息
     70         /// </summary>
     71         /// <param name="source"></param>
     72         /// <param name="message"></param>
     73         public static void Info(object source, object message)
     74         {
     75             Info(source.GetType(), message);
     76         }
     77 
     78         /// <summary>
     79         /// 关键信息
     80         /// </summary>
     81         /// <param name="source"></param>
     82         /// <param name="message"></param>
     83         public static void Info(Type source, object message)
     84         {
     85             ILog logger = GetLogger(source);
     86             if (logger.IsInfoEnabled)
     87                 logger.Info(message);
     88         }
     89 
     90         /// <summary>
     91         /// 警告信息
     92         /// </summary>
     93         /// <param name="source"></param>
     94         /// <param name="message"></param>
     95         public static void Warn(object source, object message)
     96         {
     97             Warn(source.GetType(), message);
     98         }
     99 
    100         /// <summary>
    101         /// 警告信息
    102         /// </summary>
    103         /// <param name="source"></param>
    104         /// <param name="message"></param>
    105         public static void Warn(Type source, object message)
    106         {
    107             ILog logger = GetLogger(source);
    108             if (logger.IsWarnEnabled)
    109                 logger.Warn(message);
    110         }
    111 
    112         /// <summary>
    113         /// 错误信息
    114         /// </summary>
    115         /// <param name="source"></param>
    116         /// <param name="message"></param>
    117         public static void Error(object source, object message)
    118         {
    119             Error(source.GetType(), message);
    120         }
    121 
    122         /// <summary>
    123         /// 错误信息
    124         /// </summary>
    125         /// <param name="source"></param>
    126         /// <param name="message"></param>
    127         public static void Error(Type source, object message)
    128         {
    129             ILog logger = GetLogger(source);
    130             if (logger.IsErrorEnabled)
    131                 logger.Error(message);
    132         }
    133 
    134         /// <summary>
    135         /// 失败信息
    136         /// </summary>
    137         /// <param name="source"></param>
    138         /// <param name="message"></param>
    139         public static void Fatal(object source, object message)
    140         {
    141             Fatal(source.GetType(), message);
    142         }
    143 
    144         /// <summary>
    145         /// 失败信息
    146         /// </summary>
    147         /// <param name="source"></param>
    148         /// <param name="message"></param>
    149         public static void Fatal(Type source, object message)
    150         {
    151             ILog logger = GetLogger(source);
    152             if (logger.IsFatalEnabled)
    153                 logger.Fatal(message);
    154         }
    155 
    156         /* Log a message object and exception */
    157 
    158         /// <summary>
    159         /// 调试信息
    160         /// </summary>
    161         /// <param name="source"></param>
    162         /// <param name="message"></param>
    163         /// <param name="exception"></param>
    164         public static void Debug(object source, object message, Exception exception)
    165         {
    166             Debug(source.GetType(), message, exception);
    167         }
    168 
    169         /// <summary>
    170         /// 调试信息
    171         /// </summary>
    172         /// <param name="source"></param>
    173         /// <param name="message"></param>
    174         /// <param name="exception"></param>
    175         public static void Debug(Type source, object message, Exception exception)
    176         {
    177             GetLogger(source).Debug(message, exception);
    178         }
    179 
    180         /// <summary>
    181         /// 关键信息
    182         /// </summary>
    183         /// <param name="source"></param>
    184         /// <param name="message"></param>
    185         /// <param name="exception"></param>
    186         public static void Info(object source, object message, Exception exception)
    187         {
    188             Info(source.GetType(), message, exception);
    189         }
    190 
    191         /// <summary>
    192         /// 关键信息
    193         /// </summary>
    194         /// <param name="source"></param>
    195         /// <param name="message"></param>
    196         /// <param name="exception"></param>
    197         public static void Info(Type source, object message, Exception exception)
    198         {
    199             GetLogger(source).Info(message, exception);
    200         }
    201 
    202         /// <summary>
    203         /// 警告信息
    204         /// </summary>
    205         /// <param name="source"></param>
    206         /// <param name="message"></param>
    207         /// <param name="exception"></param>
    208         public static void Warn(object source, object message, Exception exception)
    209         {
    210             Warn(source.GetType(), message, exception);
    211         }
    212 
    213         /// <summary>
    214         /// 警告信息
    215         /// </summary>
    216         /// <param name="source"></param>
    217         /// <param name="message"></param>
    218         /// <param name="exception"></param>
    219         public static void Warn(Type source, object message, Exception exception)
    220         {
    221             GetLogger(source).Warn(message, exception);
    222         }
    223 
    224         /// <summary>
    225         /// 错误信息
    226         /// </summary>
    227         /// <param name="source"></param>
    228         /// <param name="message"></param>
    229         /// <param name="exception"></param>
    230         public static void Error(object source, object message, Exception exception)
    231         {
    232             Error(source.GetType(), message, exception);
    233         }
    234 
    235         /// <summary>
    236         /// 错误信息
    237         /// </summary>
    238         /// <param name="source"></param>
    239         /// <param name="message"></param>
    240         /// <param name="exception"></param>
    241         public static void Error(Type source, object message, Exception exception)
    242         {
    243             GetLogger(source).Error(message, exception);
    244         }
    245 
    246         /// <summary>
    247         /// 失败信息
    248         /// </summary>
    249         /// <param name="source"></param>
    250         /// <param name="message"></param>
    251         /// <param name="exception"></param>
    252         public static void Fatal(object source, object message, Exception exception)
    253         {
    254             Fatal(source.GetType(), message, exception);
    255         }
    256 
    257         /// <summary>
    258         /// 失败信息
    259         /// </summary>
    260         /// <param name="source"></param>
    261         /// <param name="message"></param>
    262         /// <param name="exception"></param>
    263         public static void Fatal(Type source, object message, Exception exception)
    264         {
    265             GetLogger(source).Fatal(message, exception);
    266         }
    267         private static void SetLog4NetConfiguration()
    268         {
    269             var repo = LogManager.CreateRepository(
    270                 Assembly.GetEntryAssembly(), typeof(log4net.Repository.Hierarchy.Hierarchy));
    271             log4net.Config.XmlConfigurator.Configure(repo, new FileInfo("Log4Net.config"));
    272         }
    273     }
    274 }
    Log4NetUtility
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <configuration>
     3   <configSections>
     4     <!--添加自定义节点:log4net  type:解析类名,程序集名(log4net.dll)-->
     5     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
     6   </configSections>
     7 
     8   <log4net>
     9     <!--定义输出到文件中-->
    10     <appender name="Log4Net_INFO" type="log4net.Appender.RollingFileAppender">
    11       <!--定义文件存放位置-->
    12       <file value="Log/Info/"/>
    13       <!--是否追加到文件,默认为true,通常无需设置-->
    14       <appendToFile value="true"/>
    15       <RollingStyle value="Date"/>
    16       <!--日期的格式,每月一个文件夹,每天换一个文件记录,如不设置则永远只记录一天的日志,需设置-->
    17       <DatePattern value="yyyy-MM/yyyy-MM-dd&quot;.log&quot;" />
    18       <!--日志文件名是否为静态-->
    19       <StaticLogFileName value="false"/>
    20       <!--多线程时采用最小锁定-->
    21       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    22       <!--布局(向用户显示最后经过格式化的输出信息)-->
    23       <layout type="log4net.Layout.PatternLayout">
    24         <!--
    25            %m(message):输出的日志消息,如ILog.Debug(…)输出的一条消息 
    26            %n(new line):换行 
    27            %d(datetime):输出当前语句运行的时刻 
    28            %r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数 
    29            %t(thread id):当前语句所在的线程ID 
    30            %p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN…等 
    31            %c(class):当前日志对象的名称,例如:
    32            %L:输出语句所在的行号 
    33            %F:输出语句所在的文件名 
    34            %-数字:表示该项的最小长度,如果不够,则用空格填充
    35           -->
    36         <Header value="[Header]&#13;&#10;"/>
    37         <Footer value="[Footer]&#13;&#10;"/>
    38         <!--正文-->
    39         <ConversionPattern value="%date ThreadID:[%thread] Level:%-5level Logger:%logger property:[%property{NDC}] %nMessage:%message%newline"  />
    40       </layout>
    41       <filter type="log4net.Filter.LevelRangeFilter">
    42         <levelMin value="Debug" />
    43         <levelMax value="Warn" />
    44       </filter>
    45     </appender>
    46 
    47     <appender name="Log4Net_ERROR" type="log4net.Appender.RollingFileAppender">
    48       <file value="Log/Error/"/>
    49       <appendToFile value="true"/>
    50       <RollingStyle value="Date"/>
    51       <DatePattern value="yyyy-MM/yyyy-MM-dd&quot;.log&quot;" />
    52       <StaticLogFileName value="false"/>
    53       <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    54       <layout type="log4net.Layout.PatternLayout">
    55         <Header value="[Header]&#13;&#10;"/>
    56         <Footer value="[Footer]&#13;&#10;"/>
    57         <!--正文-->
    58         <ConversionPattern value="%date ThreadID:[%thread] Level:%-5level Logger:%logger property:[%property{NDC}] %nMessage:%message%newline"  />
    59       </layout>
    60       <filter type="log4net.Filter.LevelRangeFilter">
    61         <levelMin value="ERROR" />
    62         <levelMax value="FATAL" />
    63       </filter>
    64     </appender>
    65 
    66     <root>
    67       <level value="ALL"/>
    68       <appender-ref ref="Log4Net_INFO" />
    69       <appender-ref ref="Log4Net_ERROR" />
    70     </root>
    71 
    72   </log4net>
    73 
    74 </configuration>
    Log4Net.config

       Log4NetUtility.Info(this, "guid:" + guid);

      2,.NET Core

      a,使用Log4NetUtility.cs帮助类库,使用方式同.NET Framework,Log4Net.config同上

      b,使用依赖注入方式

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

      Programe.cs:

    .ConfigureLogging(logging =>
    {
        logging.AddFilter("System", LogLevel.Warning);//过滤系统日志
        logging.AddFilter("Microsoft", LogLevel.Warning);
        logging.AddLog4Net("Log4Net.config");//Log4Net.config文件路径
    })

     日志Level过滤也可以在appconfigs.json中进行配置:

     1 {
     2   "Logging": {
     3     "LogLevel": { // No provider, LogLevel applies to all the enabled providers.
     4       "Default": "Information",
     5       "Microsoft": "Warning",
     6       "Microsoft.Hosting.Lifetime": "Warning"
     7     },
     8     "Debug": { // Debug provider.
     9       "LogLevel": {
    10         "Default": "Information" // Overrides preceding LogLevel:Default setting.
    11       }
    12     },
    13     "Console": {
    14       "IncludeScopes": true,
    15       "LogLevel": {
    16         "Microsoft.AspNetCore.Mvc.Razor.Internal": "Warning",
    17         "Microsoft.AspNetCore.Mvc.Razor.Razor": "Debug",
    18         "Microsoft.AspNetCore.Mvc.Razor": "Error",
    19         "Default": "Information"
    20       }
    21     },
    22     "EventSource": {
    23       "LogLevel": {
    24         "Microsoft": "Information"
    25       }
    26     },
    27     "EventLog": {
    28       "LogLevel": {
    29         "Microsoft": "Information"
    30       }
    31     },
    32     "AzureAppServicesFile": {
    33       "IncludeScopes": true,
    34       "LogLevel": {
    35         "Default": "Warning"
    36       }
    37     },
    38     "AzureAppServicesBlob": {
    39       "IncludeScopes": true,
    40       "LogLevel": {
    41         "Microsoft": "Information"
    42       }
    43     },
    44     "ApplicationInsights": {
    45       "LogLevel": {
    46         "Default": "Information"
    47       }
    48     }
    49   }
    50 }
    appsettings.json

  • 相关阅读:
    Minecraft 1.12.2/1.14.4 Mod开发笔记——搭建环境
    Minecraft 1.12.2 Mod开发笔记
    浅谈莫比乌斯反演
    卡迈克尔数
    一些可能会有用的东西(持续更新)
    emacs配置
    CSPS 2020游记
    浅谈KMP
    Atcoder AGC052
    乌班图操作指令(持续更新)
  • 原文地址:https://www.cnblogs.com/shangec/p/14666007.html
Copyright © 2011-2022 走看看