前面都是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/"Fatal.log""/> 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/"Error.log""/> 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/"Warn.log""/> 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/"Info.log""/> 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/"Debug.log""/> 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>
这里配置会在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 }
好了,类库中的配置已经完成了,下面是调用方的配置
1、调用方可以是WinFrom,WPF,Web等可以直接运行的项目,右键---管理Nuget程序包添加log4net的包
2、需要调用的地方添加
Logger.Singleton.Debug("This is a debug file");
当然上面的代码只是为了测试,具体用什么样的错误级别和什么错误信息,需要自己手动输入实现