本文主要讲述如何构建封装一个日志工具类,以及在该过程中遇到的问题,
关于Log4Net的介绍,就不详细赘述了,更多详细的技术可参考http://www.cnblogs.com/kissazi2/p/3393595.html
在我完成本功能的过程中也详细拜读了他的博客,讲解的很详细。接下来我将我自己完成的Log4Net做一个展示。在本系统中,存在一个基础类库存放LogHelper工具类以及其他一些工具类,一个Web项目Zone用于调用Log,输出log信息,其他不相干的就不介绍了。其实该功能是相对来说都大同小异。项目目录如下:
一、引入log4net.dll文件
首先需要在项目中引入log4net,引用->Nuget包管理->搜索log4net->Apache Log4net->安装即可,或直接在项目中引入log4net.dll文件
二、创建log4net的工具类
创建一个类库,Commons类库,创建一个基础类LogHelper,供其他地方调用
具体代码如下:
/// <summary> /// 日志 /// </summary> public class LogHelper { //日志级别 private const string ErrorLevel = "Error"; private const string DebugLevel = "Debug"; private const string InfoLevel = "Info"; private const string FatalLevel = "Fatal"; private const string WarningLevel = "Warn"; static LogHelper() { var path = AppDomain.CurrentDomain.BaseDirectory + @"log4net.config"; log4net.Config.XmlConfigurator.Configure(new FileInfo(path)); } #region 获得ILog /// <summary> /// 根据Log等级获得log /// </summary> /// <param name="logLevel">Log等级</param> /// <returns></returns> public static ILog GetLog(string logLevel) { var log = log4net.LogManager.GetLogger(logLevel); return log; } #endregion #region Info 级别的日志 public static void Info(string message) { var log = GetLog(InfoLevel); if (log.IsInfoEnabled) { log.Info(message); } } #endregion #region Info 级别的日志 public static void Info(string message,Exception ex) { var log = GetLog(InfoLevel); if (log.IsInfoEnabled) { log.Info(message,ex); } } #endregion #region Debug 级别的日志 public static void Debug(string message) { var log = GetLog(DebugLevel); if (log.IsDebugEnabled) { log.Debug(message); } } #endregion #region Debug 级别的日志 public static void Debug(string message,Exception ex) { var log = GetLog(DebugLevel); if (log.IsDebugEnabled) { log.Debug(message,ex); } } #endregion #region Error 级别的日志 public static void Error(string message) { var log = GetLog(ErrorLevel); if (log.IsErrorEnabled) { log.Error(message); } } #endregion #region Error 级别的日志 public static void Error(string message,Exception ex) { var log = GetLog(ErrorLevel); if (log.IsErrorEnabled) { log.Error(message,ex); } } #endregion #region Fatal 级别的日志 public static void Fatal(string message) { var log = GetLog(FatalLevel); if (log.IsFatalEnabled) { log.Fatal(message); } } #endregion #region Fatal 级别的日志 public static void Fatal(string message,Exception ex) { var log = GetLog(FatalLevel); if (log.IsFatalEnabled) { log.Fatal(message,ex); } } #endregion #region Warn 级别的日志 public static void Warning(string message) { var log = GetLog(WarningLevel); if (log.IsWarnEnabled) { log.Warn(message); } } #endregion #region Warn 级别的日志 public static void Waring(string message,Exception ex) { var log = GetLog(WarningLevel); if (log.IsWarnEnabled) { log.Warn(message,ex); } } #endregion }
三、在该类库的AssemblyInfo.cs文件末尾添加
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
四、创建log4net.config
在调用LogHelper的项目中,创建一个log4net.config,我这里使用的配置内容如下;
<?xml version="1.0" encoding="utf-8"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <root> <!--控制级别由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF--> <!--比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录--> <!--如果没有定义LEVEL的值,则缺省为DEBUG--> <level value="ALL"/> </root> <appender name="TestInfo" type="log4net.Appender.RollingFileAppender" > <file value="log/Info/"/> <appendToFile value="true"/> <rollingStyle value="Composite" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="1MB" /> <staticLogFileName value="false" /> <DatePattern value="yyyy-MM-dd".txt""/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %-5level - %message%newline" /> </layout> </appender> <appender name="TestError" type="log4net.Appender.RollingFileAppender"> <file value="log/Error/" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="1MB" /> <staticLogFileName value="false" /> <DatePattern value="yyyy-MM-dd".txt""/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %-5level - %message%newline" /> </layout> </appender> <appender name="TestDebug" type="log4net.Appender.RollingFileAppender"> <file value="log/Debug/" /> <appendToFile value="true" /> <rollingStyle value="Composite" /> <maxSizeRollBackups value="-1" /> <maximumFileSize value="1MB" /> <staticLogFileName value="false" /> <DatePattern value="yyyy-MM-dd".txt""/> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%date %-5level - %message%newline" /> </layout> </appender> <logger name="Info"> <level value="ALL"/> <appender-ref ref="Info" /> <appender-ref ref="TestInfo" /> </logger> <logger name="Error"> <level value="ALL"/> <appender-ref ref="Error" /> <appender-ref ref="TestError" /> </logger> <logger name="Debug"> <level value="ALL"/> <appender-ref ref="Debug" /> <appender-ref ref="TestDebug" /> </logger> </log4net> </configuration>
关于参数的详细配置,我就不做介绍了,可参考上文提到的博客中有详细介绍(注意,我在loghelper中虽然写了Warn和Fatal级别的日志,但在此配置中没有对这两个级别的日志做配置,故,项目不会产生这两个级别的日志)
修改log4net.config文件的属性为"始终复制"
五、在需要使用Log4Net的项目中添加该类库的引用(本系统就是Commons.dll)
在需要打印log的地方使用。修改
LogHelper.Info("产生LOG");//产生一条Info级别的Log信息
运行项目会在该项目目录下产生log/Debug/当前日期.txt、log/Error/当前日期.txt、log/Info/当前日期.txt.
在本文中红色标注的地方是可能出错的地方,如有异常一定要先检查这些