Fork me on GitHub

NetStandard类库实现Log4Net集成

前面都是Log4Net集成到NetCore项目中,集成到NetStandard类库还是第一次,所以记录一下

小提示:NetStandard要想同时被NetCore和NetFramework调用,需要在项目右键编辑xxxx.csproj, 然后打开项目编辑

修改保存后会重新生成加载项目,选确定就行了

上面是前话,下面直接进入正题

1、需要添加的NetStandard类库右键----管理Nuget程序包,选择log4net包添加到类库中

2、类库下添加一个应用程序配置文件,名字随意,我这里用的是log4net.config

3、log4net.config配置文件内容

  1 <?xml version="1.0" encoding="utf-8" ?>
  2 <configuration>
  3   <configSections>
  4     <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  5   </configSections>
  6   <log4net>
  7     <!--根配置-->
  8     <root>
  9       <!--日志级别:可选值: ERROR > WARN > INFO > DEBUG -->
 10       <level value="FATAL" />
 11       <level value="ERROR"/>
 12       <level value="WARN"/>
 13       <level value="INFO"/>
 14       <level value="DEBUG"/>
 15       <appender-ref ref="FatalLog" />
 16       <appender-ref ref="ErrorLog" />
 17       <appender-ref ref="WarnLog" />
 18       <appender-ref ref="InfoLog" />
 19       <appender-ref ref="DebugLog" />
 20     </root>
 21 
 22     <!-- 错误 Fatal.log-->
 23     <appender name="FatalLog" type="log4net.Appender.RollingFileAppender">
 24       <!--目录路径,可以是相对路径或绝对路径-->
 25       <param name="File" value="Logs"/>
 26       <!--文件名,按日期生成文件夹-->
 27       <param name="DatePattern" value="/yyyy-MM-dd/&quot;Fatal.log&quot;"/>
 28       <!--追加到文件-->
 29       <appendToFile value="true"/>
 30       <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
 31       <rollingStyle value="Composite"/>
 32       <!--写到一个文件-->
 33       <staticLogFileName value="false"/>
 34       <!--单个文件大小。单位:KB|MB|GB-->
 35       <maximumFileSize value="200MB"/>
 36       <!--最多保留的文件数,设为"-1"则不限-->
 37       <maxSizeRollBackups value="-1"/>
 38       <!--日志格式-->
 39       <layout type="log4net.Layout.PatternLayout">
 40         <param name="ConversionPattern" value="时间:%date 描述:%message 异常:%exception  %n" />
 41       </layout>
 42       <filter type="log4net.Filter.LevelRangeFilter">
 43         <param name="LevelMin" value="FATAL" />
 44         <param name="LevelMax" value="FATAL" />
 45       </filter>
 46     </appender>
 47     
 48     <!-- 错误 Error.log-->
 49     <appender name="ErrorLog" type="log4net.Appender.RollingFileAppender">
 50       <!--目录路径,可以是相对路径或绝对路径-->
 51       <param name="File" value="Logs"/>
 52       <!--文件名,按日期生成文件夹-->
 53       <param name="DatePattern" value="/yyyy-MM-dd/&quot;Error.log&quot;"/>
 54       <!--追加到文件-->
 55       <appendToFile value="true"/>
 56       <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
 57       <rollingStyle value="Composite"/>
 58       <!--写到一个文件-->
 59       <staticLogFileName value="false"/>
 60       <!--单个文件大小。单位:KB|MB|GB-->
 61       <maximumFileSize value="200MB"/>
 62       <!--最多保留的文件数,设为"-1"则不限-->
 63       <maxSizeRollBackups value="-1"/>
 64       <!--日志格式-->
 65       <layout type="log4net.Layout.PatternLayout">
 66         <param name="ConversionPattern" value="时间:%date 描述:%message 异常:%exception  %n" />
 67       </layout>
 68       <filter type="log4net.Filter.LevelRangeFilter">
 69         <param name="LevelMin" value="ERROR" />
 70         <param name="LevelMax" value="ERROR" />
 71       </filter>
 72     </appender>
 73 
 74     <!-- 警告 Warn.log-->
 75     <appender name="WarnLog" type="log4net.Appender.RollingFileAppender">
 76       <!--目录路径,可以是相对路径或绝对路径-->
 77       <param name="File" value="Logs"/>
 78       <!--文件名,按日期生成文件夹-->
 79       <param name="DatePattern" value="/yyyy-MM-dd/&quot;Warn.log&quot;"/>
 80       <!--追加到文件-->
 81       <appendToFile value="true"/>
 82       <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
 83       <rollingStyle value="Composite"/>
 84       <!--写到一个文件-->
 85       <staticLogFileName value="false"/>
 86       <!--单个文件大小。单位:KB|MB|GB-->
 87       <maximumFileSize value="200MB"/>
 88       <!--最多保留的文件数,设为"-1"则不限-->
 89       <maxSizeRollBackups value="-1"/>
 90       <!--日志格式-->
 91       <layout type="log4net.Layout.PatternLayout">
 92         <param name="ConversionPattern" value="时间:%date 描述:%message %n" />
 93       </layout>
 94       <filter type="log4net.Filter.LevelRangeFilter">
 95         <param name="LevelMin" value="WARN" />
 96         <param name="LevelMax" value="WARN" />
 97       </filter>
 98     </appender>
 99 
100     <!-- 信息 Info.log-->
101     <appender name="InfoLog" type="log4net.Appender.RollingFileAppender">
102       <!--目录路径,可以是相对路径或绝对路径-->
103       <param name="File" value="Logs"/>
104       <!--文件名,按日期生成文件夹-->
105       <param name="DatePattern" value="/yyyy-MM-dd/&quot;Info.log&quot;"/>
106       <!--追加到文件-->
107       <appendToFile value="true"/>
108       <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
109       <rollingStyle value="Composite"/>
110       <!--写到一个文件-->
111       <staticLogFileName value="false"/>
112       <!--单个文件大小。单位:KB|MB|GB-->
113       <maximumFileSize value="200MB"/>
114       <!--最多保留的文件数,设为"-1"则不限-->
115       <maxSizeRollBackups value="-1"/>
116       <!--日志格式-->
117       <layout type="log4net.Layout.PatternLayout">
118         <param name="ConversionPattern" value="时间:%date 描述:%message %n" />
119       </layout>
120       <filter type="log4net.Filter.LevelRangeFilter">
121         <param name="LevelMin" value="INFO" />
122         <param name="LevelMax" value="INFO" />
123       </filter>
124     </appender>
125 
126     <!-- 调试 Debug.log-->
127     <appender name="DebugLog" type="log4net.Appender.RollingFileAppender">
128       <!--目录路径,可以是相对路径或绝对路径-->
129       <param name="File" value="Logs"/>
130       <!--文件名,按日期生成文件夹-->
131       <param name="DatePattern" value="/yyyy-MM-dd/&quot;Debug.log&quot;"/>
132       <!--追加到文件-->
133       <appendToFile value="true"/>
134       <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
135       <rollingStyle value="Composite"/>
136       <!--写到一个文件-->
137       <staticLogFileName value="false"/>
138       <!--单个文件大小。单位:KB|MB|GB-->
139       <maximumFileSize value="200MB"/>
140       <!--最多保留的文件数,设为"-1"则不限-->
141       <maxSizeRollBackups value="-1"/>
142       <!--日志格式-->
143       <layout type="log4net.Layout.PatternLayout">
144         <param name="ConversionPattern" value="时间:%date 描述:%message 异常:%exception  %newline" />
145       </layout>
146       <filter type="log4net.Filter.LevelRangeFilter">
147         <param name="LevelMin" value="DEBUG" />
148         <param name="LevelMax" value="DEBUG" />
149       </filter>
150     </appender>
151 
152   </log4net>
153 </configuration>
View Code

这里配置会在bin/log下生成一个时间文件夹,文件夹有五个文件,分别是debug,info,warn,error,fatal,根据不同的错误级别写在不同的文件内。log4Net的具体配置请自行百度

4、添加自定义Logger类

  1 using log4net;
  2 using System;
  3 using System.Reflection;
  4 
  5 [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
  6 namespace FiiiCoin.Utility
  7 {
  8     public sealed class Logger
  9     {
 10         #region [ 单例模式 ]
 11 
 12         private static Logger logger;
 13         private static readonly log4net.ILog _Logger4net = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
 14 
 15         /// <summary>  
 16         /// 无参私有构造函数  
 17         /// </summary>  
 18         private Logger()
 19         {
 20         }
 21 
 22         /// <summary>  
 23         /// 得到单例  
 24         /// </summary>  
 25         public static Logger Singleton
 26         {
 27             get
 28             {
 29                 if (logger == null)
 30                 {
 31                     logger = new Logger();
 32                 }
 33                 return logger;
 34             }
 35         }
 36 
 37         #endregion  
 38 
 39         #region [ 参数 ]
 40 
 41         public bool IsDebugEnabled
 42         {
 43             get { return _Logger4net.IsDebugEnabled; }
 44         }
 45         public bool IsInfoEnabled
 46         {
 47             get { return _Logger4net.IsInfoEnabled; }
 48         }
 49         public bool IsWarnEnabled
 50         {
 51             get { return _Logger4net.IsWarnEnabled; }
 52         }
 53         public bool IsErrorEnabled
 54         {
 55             get { return _Logger4net.IsErrorEnabled; }
 56         }
 57         public bool IsFatalEnabled
 58         {
 59             get { return _Logger4net.IsFatalEnabled; }
 60         }
 61 
 62         #endregion  
 63 
 64         #region [ 接口方法 ]
 65 
 66         #region [ Debug ]
 67 
 68         public void Debug(string message)
 69         {
 70             if (this.IsDebugEnabled)
 71             {
 72                 this.Log(LogLevel.Debug, message);
 73             }
 74         }
 75 
 76         public void Debug(string message, Exception exception)
 77         {
 78             if (this.IsDebugEnabled)
 79             {
 80                 this.Log(LogLevel.Debug, message, exception);
 81             }
 82         }
 83 
 84         public void DebugFormat(string format, params object[] args)
 85         {
 86             if (this.IsDebugEnabled)
 87             {
 88                 this.Log(LogLevel.Debug, format, args);
 89             }
 90         }
 91 
 92         public void DebugFormat(string format, Exception exception, params object[] args)
 93         {
 94             if (this.IsDebugEnabled)
 95             {
 96                 this.Log(LogLevel.Debug, string.Format(format, args), exception);
 97             }
 98         }
 99 
100         #endregion
101 
102         #region [ Info ]
103 
104         public void Info(string message)
105         {
106             if (this.IsInfoEnabled)
107             {
108                 this.Log(LogLevel.Info, message);
109             }
110         }
111 
112         public void Info(string message, Exception exception)
113         {
114             if (this.IsInfoEnabled)
115             {
116                 this.Log(LogLevel.Info, message, exception);
117             }
118         }
119 
120         public void InfoFormat(string format, params object[] args)
121         {
122             if (this.IsInfoEnabled)
123             {
124                 this.Log(LogLevel.Info, format, args);
125             }
126         }
127 
128         public void InfoFormat(string format, Exception exception, params object[] args)
129         {
130             if (this.IsInfoEnabled)
131             {
132                 this.Log(LogLevel.Info, string.Format(format, args), exception);
133             }
134         }
135 
136         #endregion
137 
138         #region  [ Warn ]
139 
140         public void Warn(string message)
141         {
142             if (this.IsWarnEnabled)
143             {
144                 this.Log(LogLevel.Warn, message);
145             }
146         }
147 
148         public void Warn(string message, Exception exception)
149         {
150             if (this.IsWarnEnabled)
151             {
152                 this.Log(LogLevel.Warn, message, exception);
153             }
154         }
155 
156         public void WarnFormat(string format, params object[] args)
157         {
158             if (this.IsWarnEnabled)
159             {
160                 this.Log(LogLevel.Warn, format, args);
161             }
162         }
163 
164         public void WarnFormat(string format, Exception exception, params object[] args)
165         {
166             if (this.IsWarnEnabled)
167             {
168                 this.Log(LogLevel.Warn, string.Format(format, args), exception);
169             }
170         }
171 
172         #endregion
173 
174         #region  [ Error ]
175 
176         public void Error(string message)
177         {
178             if (this.IsErrorEnabled)
179             {
180                 this.Log(LogLevel.Error, message);
181             }
182         }
183 
184         public void Error(string message, Exception exception)
185         {
186             if (this.IsErrorEnabled)
187             {
188                 this.Log(LogLevel.Error, message, exception);
189             }
190         }
191 
192         public void ErrorFormat(string format, params object[] args)
193         {
194             if (this.IsErrorEnabled)
195             {
196                 this.Log(LogLevel.Error, format, args);
197             }
198         }
199 
200         public void ErrorFormat(string format, Exception exception, params object[] args)
201         {
202             if (this.IsErrorEnabled)
203             {
204                 this.Log(LogLevel.Error, string.Format(format, args), exception);
205             }
206         }
207         #endregion
208 
209         #region  [ Fatal ]
210 
211         public void Fatal(string message)
212         {
213             if (this.IsFatalEnabled)
214             {
215                 this.Log(LogLevel.Fatal, message);
216             }
217         }
218 
219         public void Fatal(string message, Exception exception)
220         {
221             if (this.IsFatalEnabled)
222             {
223                 this.Log(LogLevel.Fatal, message, exception);
224             }
225         }
226 
227         public void FatalFormat(string format, params object[] args)
228         {
229             if (this.IsFatalEnabled)
230             {
231                 this.Log(LogLevel.Fatal, format, args);
232             }
233         }
234 
235         public void FatalFormat(string format, Exception exception, params object[] args)
236         {
237             if (this.IsFatalEnabled)
238             {
239                 this.Log(LogLevel.Fatal, string.Format(format, args), exception);
240             }
241         }
242         #endregion
243 
244         #endregion
245 
246         #region [ 内部方法 ]  
247         /// <summary>  
248         /// 输出普通日志  
249         /// </summary>  
250         /// <param name="level"></param>  
251         /// <param name="format"></param>  
252         /// <param name="args"></param>  
253         private void Log(LogLevel level, string format, params object[] args)
254         {
255             switch (level)
256             {
257                 case LogLevel.Debug:
258                     _Logger4net.DebugFormat(format, args);
259                     break;
260                 case LogLevel.Info:
261                     _Logger4net.InfoFormat(format, args);
262                     break;
263                 case LogLevel.Warn:
264                     _Logger4net.WarnFormat(format, args);
265                     break;
266                 case LogLevel.Error:
267                     _Logger4net.ErrorFormat(format, args);
268                     break;
269                 case LogLevel.Fatal:
270                     _Logger4net.FatalFormat(format, args);
271                     break;
272             }
273         }
274 
275         /// <summary>  
276         /// 格式化输出异常信息  
277         /// </summary>  
278         /// <param name="level"></param>  
279         /// <param name="message"></param>  
280         /// <param name="exception"></param>  
281         private void Log(LogLevel level, string message, Exception exception)
282         {
283             switch (level)
284             {
285                 case LogLevel.Debug:
286                     _Logger4net.Debug(message, exception);
287                     break;
288                 case LogLevel.Info:
289                     _Logger4net.Info(message, exception);
290                     break;
291                 case LogLevel.Warn:
292                     _Logger4net.Warn(message, exception);
293                     break;
294                 case LogLevel.Error:
295                     _Logger4net.Error(message, exception);
296                     break;
297                 case LogLevel.Fatal:
298                     _Logger4net.Fatal(message, exception);
299                     break;
300             }
301         }
302         #endregion
303     }
304 
305     #region [ enum: LogLevel ]
306 
307     /// <summary>  
308     /// 日志级别  
309     /// </summary>  
310     public enum LogLevel
311     {
312         Debug,
313         Info,
314         Warn,
315         Error,
316         Fatal
317     }
318 
319     #endregion 
320 }
View Code

好了,类库中的配置已经完成了,下面是调用方的配置

1、调用方可以是WinFrom,WPF,Web等可以直接运行的项目,右键---管理Nuget程序包添加log4net的包

2、需要调用的地方添加

Logger.Singleton.Debug("This is a debug file");

当然上面的代码只是为了测试,具体用什么样的错误级别和什么错误信息,需要自己手动输入实现

 

posted @ 2018-06-28 10:47 雪山玉龙 阅读(...) 评论(...) 编辑 收藏