Log4Net五部曲

本文主要讲述如何构建封装一个日志工具类,以及在该过程中遇到的问题,

关于Log4Net的介绍,就不详细赘述了,更多详细的技术可参考http://www.cnblogs.com/kissazi2/p/3393595.html

在我完成本功能的过程中也详细拜读了他的博客,讲解的很详细。接下来我将我自己完成的Log4Net做一个展示。在本系统中,存在一个基础类库存放LogHelper工具类以及其他一些工具类,一个Web项目Zone用于调用Log,输出log信息,其他不相干的就不介绍了。其实该功能是相对来说都大同小异。项目目录如下:

Log4Net五部曲

引入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&quot;.txt&quot;"/>
      <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&quot;.txt&quot;"/>
      <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&quot;.txt&quot;"/>
      <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五部曲

五、在需要使用Log4Net的项目中添加该类库的引用(本系统就是Commons.dll)

在需要打印log的地方使用。修改

LogHelper.Info("产生LOG");//产生一条Info级别的Log信息

运行项目会在该项目目录下产生log/Debug/当前日期.txt、log/Error/当前日期.txt、log/Info/当前日期.txt.

在本文中红色标注的地方是可能出错的地方,如有异常一定要先检查这些