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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章