zoukankan      html  css  js  c++  java
  • log4net使用详解

    Log4net库是.Net下一个非常优秀的开源日志记录组件,是一个帮助程序员将日志信息输出到各种目标(控制台、文件、数据库等)的工具。

    它具有:支持多数框架、可输出日志到多种目标、层级日志体系、可使用XML配置、可动态配置、模块化和可扩展化设计、灵活、高性能等特征。

    日志记录器(Logger)的行为是分等级的,一般可分为5种日志等级(Level),优先级从高到低:

    1、FATAL(致命错误):记录系统中出现的能使用系统完全失去功能,服务停止,系统崩溃等使系统无法继续运行下去的错误。例如,数据库无法连接,系统出现死循环。

    2、ERROR(一般错误):记录系统中出现的导致系统不稳定,部分功能出现混乱或部分功能失效一类的错误。例如,数据字段为空,数据操作不可完成,操作出现异常等。

    3、WARN(警告):记录系统中不影响系统继续运行,但不符合系统运行正常条件,有可能引起系统错误的信息。例如,记录内容为空,数据内容不正确等。

    4、INFO(一般信息):记录系统运行中应该让用户知道的基本信息。例如,服务开始运行,功能已经开户等。

    5、DEBUG (调试信息):记录系统用于调试的一切信息,内容或者是一些关键数据内容的输出。

    我们可以控制到应用程序中相应级别的日志信息的开关。比如在定义了INFO级别, 则应用程序中所有DEBUG级别的日志信息将不被打印出来。

    使用实例:

    创建log4net.xml文件放到项目根目录。

    xml配置文件:

    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
      </configSections>
      <log4net>
        <logger name="LogInfo" additivity="false">
          <level value="ALL" />
          <appender-ref ref="InfoAppender"/>
        </logger>
        <logger name="LogError" additivity="false">
          <level value="ALL" />
          <appender-ref ref="ErrorAppender"/>
        </logger>
        <logger name="LogSmsInfo" additivity="false">
          <level value="ALL" />
          <appender-ref ref="SmsInfoAppender"/>
        </logger>
        <logger name="LogSmsError" additivity="false">
          <level value="ALL" />
          <appender-ref ref="SmsErrorAppender"/>
        </logger>
        <!--Info.log-->
        <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender,log4net">
          <!--过滤-->
          <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="INFO" />
            <param name="LevelMax" value="INFO" />
          </filter>
          <!--目录路径,可以是相对路径或绝对路径-->
          <param name="File" value="Log\"/>
          <!--文件名,按日期生成文件夹-->
          <param name="DatePattern" value="yyyy-MM-dd'.txt'"/>
          <!--追加到文件-->
          <appendToFile value="true"/>
          <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
          <rollingStyle value="Composite"/>
          <!--写到一个文件-->
          <staticLogFileName value="false"/>
          <!--单个文件大小。单位:KB|MB|GB-->
          <maximumFileSize value="4MB"/>
          <!--最多保留的文件数,设为"-1"则不限-->
          <maxSizeRollBackups value="-1"/>
          <!--日志格式-->
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%n%n %date{yyyy-MM-dd HH:mm:ss,fff} %m"/>
          </layout>
        </appender>
    
        <!--Error.log-->
        <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender,log4net">
          <!--过滤-->
          <filter type="log4net.Filter.LevelRangeFilter">
            <param name="LevelMin" value="INFO" />
            <param name="LevelMax" value="INFO" />
          </filter>
          <!--目录路径,可以是相对路径或绝对路径-->
          <param name="File" value="log\"/>
          <!--文件名,按日期生成文件夹-->
          <param name="DatePattern" value="yyyy-MM-dd 'error.txt'"/>
          <!--追加到文件-->
          <appendToFile value="true"/>
          <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
          <rollingStyle value="Composite"/>
          <!--写到一个文件-->
          <staticLogFileName value="false"/>
          <!--单个文件大小。单位:KB|MB|GB-->
          <maximumFileSize value="4MB"/>
          <!--最多保留的文件数,设为"-1"则不限-->
          <maxSizeRollBackups value="-1"/>
          <!--日志格式-->
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%n%n %date{yyyy-MM-dd HH:mm:ss,fff} %m"/>
          </layout>
        </appender>
      </log4net>
    </configuration>

    xml配置注释

    输出样式:

     %p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。 
    %d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。 
    %r:输出自应用程序启动到输出该log信息耗费的毫秒数。 
    %t:输出产生该日志事件的线程名。 
    %l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。 
    %c:输出日志信息所属的类目,通常就是所在类的全名。 
    %M:输出产生日志信息的方法名。 
    %F:输出日志消息产生时所在的文件名称。 
    %L::输出代码中的行号。 
    %m::输出代码中指定的具体日志信息。 
    %n:输出一个回车换行符,Windows平台为" ",Unix平台为" "。 
    %x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 
    %%:输出一个"%"字符。 
    另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如: 
    1)%20c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。 
    2)%-20c:"-"号表示左对齐。 
    3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。

    c# helper类代码:

    public class Log4Helper
        {
            public static log4net.ILog Loginfo = log4net.LogManager.GetLogger("LogInfo");
            public static log4net.ILog Logerror = log4net.LogManager.GetLogger("LogError");
            public static Log4Helper MInstance;
            public static Log4Helper GetInstance()
            {
                return MInstance ?? (MInstance = new Log4Helper());
            }
    
            public Log4Helper()
            {
                var file = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "\log4net.xml");
                log4net.Config.XmlConfigurator.Configure(file);
            }
    
            /// <summary>
            /// 设置备置文件
            /// </summary>
            /// <param name="configFile"></param>
            public static void SetConfig(FileInfo configFile)
            {
                log4net.Config.XmlConfigurator.Configure(configFile);
            }
    
            /// <summary>
            /// 写入信息
            /// </summary>
            /// <param name="info"></param>
            public void WriteInfo(string info)
            {
                if (Loginfo.IsInfoEnabled)
                {
                    Loginfo.Info(info);
                }
            }
    
            /// <summary>
            /// 写入错误信息
            /// </summary>
            /// <param name="info"></param>
            public void WriteError(string info)
            {
                if (Logerror.IsInfoEnabled)
                {
                    Logerror.Info(info);
                }
            }
    
    
            /// <summary>
            /// 写入错误信息
            /// </summary>
            /// <param name="loggerName"></param>
            /// <param name="info"></param>
            public void WriteInfo(string loggerName, string info)
            {
                log4net.ILog logInfo = log4net.LogManager.GetLogger(loggerName);
                if (logInfo.IsInfoEnabled)
                {
                    logInfo.Info(info);
                }
            }
    
    
            /// <summary>
            /// 写入信息
            /// </summary>
            /// <param name="message"></param>
            public void Info(string message)
            {
                if (Loginfo.IsInfoEnabled)
                {
                    Loginfo.Info(message);
                }
            }
    
            /// <summary>
            /// 写入错误信息
            /// </summary>
            /// <param name="message"></param>
            public void Error(string message)
            {
                if (Logerror.IsInfoEnabled)
                {
                    Logerror.Info(message);
                }
            }
    
            /// <summary>
            /// 写入错误信息
            /// </summary>
            /// <param name="ex"></param>
            public void Error(Exception ex)
            {
                if (Logerror.IsInfoEnabled)
                {
                    var sb = new StringBuilder("");
                    sb.AppendFormat("
    异常信息:{0}", ex.Message);
                    sb.AppendFormat("
    异常来源:{0}", ex.Source);
                    sb.AppendFormat("
    异常堆栈:{0}", ex.StackTrace);
                    Logerror.Info(sb.ToString());
                }
            }
            /// <summary>
            /// 写入错误信息
            /// </summary>
            /// <param name="msg">消息</param>
            /// <param name="ex">异常</param>
            public void Error(string msg, Exception ex)
            {
                if (Logerror.IsInfoEnabled)
                {
                    Logerror.Info(msg, ex);
                }
            }
    
    
        }

    项目中使用:

    /// <summary>
            /// 恢复运行暂停的任务
            /// </summary>
            /// <param name="jobKey">任务key</param>
            public static void ResumeJob(string jobKey)
            {
                try
                {
                    JobKey jk = new JobKey(jobKey);
                    if (_scheduler.CheckExists(jk))
                    {
                        //任务已经存在则暂停任务
                        _scheduler.ResumeJob(jk);
                        Log4Helper.GetInstance().Info(string.Format("任务“{0}”恢复运行", jobKey));
                    }
                }
                catch (Exception ex)
                {
                    Log4Helper.GetInstance().Info("任务恢复运行");
                    Log4Helper.GetInstance().Error("恢复任务失败!");//记录错误信息
                    Log4Helper.GetInstance().Error("恢复任务失败!", ex);//记录错误信息
                    Log4Helper.GetInstance().Error(ex);//记录错误信息
                }
            }

  • 相关阅读:
    关于client浏览器界面文字内容溢出用省略号表示方法
    Oracle 11gR2光钎链路切换crs服务发生crash
    制作U盘启动盘将Ubuntu 12.04升级为14.04的方法
    Android图片处理——压缩、剪裁、圆角、保存
    安卓使用WebView下载文件,安卓实现软件升级功能
    Android仿Win8界面的button点击
    Chormium线程模型及应用指南
    POJ 3436 ACM Computer Factory 最大流
    hdu 3547 DIY Cube (Ploya定理)
    ant安装配置问题:ANT_HOME is set incorrectly or ant could not be located. Please set ANT_HOME.
  • 原文地址:https://www.cnblogs.com/jiangqw/p/12121209.html
Copyright © 2011-2022 走看看