C#Log4net日子记录

来源:互联网 发布:手机图片抓取软件 编辑:程序博客网 时间:2024/05/20 10:54

日志记录是软件开发中最基本的需求,对于软件维护和调试至关重要。此次主要记录最近一个项目中使用Log4net记录系统日志的使用方法,本文只做简单介绍。
对于Log4net的使用方法网上介绍很多,但是在实际项目使用中却会遇到很多问题。例如项目比较大,每个人对对代码处理方法方式都不一样,如果每个人都需要在自己的代码中添加日志记录这样处理比较麻烦,如果一旦开发人员忘记添加日志记录,那么在运维过程中一旦程序出现问题那么就可能无法及时记载出现的问题。在实际软件开发过程中,开发人员都是将任务写成一个个dll供主程序来调用。因此我们只需要在主程序中添加相关的异常错误捕获即可,这样处理起来比较方便,可以比较好的记录日志。下面举一个例子来说明:
一个项目有十个子系统,每个子系统都分配给不同的不同研发人员进行开发。主程序的框架通过动态添加dll来调用这些子系统,同时为每个子系统开辟一个线程来进行处理。整个项目代码量比较大,运维阶段一旦出现崩溃很难找到问题的所在。因此日志记录很重要,我们需要通过日志快速找到哪个子系统出现问题,同时是哪一行代码出现问题,同时我们需要哪个线程以及出现Bug的日期时间以及异常描述等信息。下面给的是一个app.config文件中对Log4net的配置:

 <log4net>    <!--定义输出到文件中-->    <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">      <file value="log\\" />      <appendToFile value="true" />      <rollingStyle value="Date" />      <datePattern value="yyyy\\MM\\dd'.txt'" />      <staticLogFileName value="false" />      <param name="MaxSizeRollBackups" value="100" />      <layout type="log4net.Layout.PatternLayout">      </layout>    </appender>    <root>      <level value="ERROR" />      <!--文件形式记录日志-->      <appender-ref ref="RollingLogFileAppender" />    </root>  </log4net>

同时我们需要建立一个xml文件来配置Log4net,例如可以配置为如下:

<?xml version="1.0" encoding="utf-8" ?><log4net>  <appender name="TastInfo" 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="TastError" 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="TastDebug" 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="TastInfo" />  </logger>  <logger name="Error">    <level value="ALL"/>    <appender-ref ref="Error" />    <appender-ref ref="TastError" />  </logger>  <logger name="Debug">    <level value="ALL"/>    <appender-ref ref="Debug" />    <appender-ref ref="TastDebug" />  </logger></log4net>

最后为了方便日志的分类记录,我们可以创建一个static class来处理,我们只要做好异常处理,然后根据相采用事件委托的方式将异常记录到日志即可。 static class可以根据需求来进行创建,以下只是一个例子

public static class Log4Helper    {        public static void Fatal(Type type, object message, Exception exception = null)        {            ILog log = LogManager.GetLogger(type);            if (exception == null)                log.Fatal(message);            else                log.Fatal(message, exception);        }        public static void Error(Type type, object message, Exception exception = null)        {            ILog log = LogManager.GetLogger(type);            if (exception == null)                log.Error(message);            else                log.Error(message, exception);        }        public static void Warn(Type type, object message, Exception exception = null)        {            ILog log = LogManager.GetLogger(type);            if (exception == null)                log.Warn(message);            else                log.Warn(message, exception);        }        public static void Info(Type type, object message, Exception exception = null)        {            ILog log = LogManager.GetLogger(type);            if (exception == null)                log.Info(message);            else                log.Info(message, exception);        }        public static void Debug(Type type, object message, Exception exception = null)        {            ILog log = LogManager.GetLogger(type);            if (exception == null)                log.Debug(message);            else                log.Debug(message, exception);        }    }

例如使用方法:

    Application.EnableVisualStyles();            Application.SetCompatibleTextRenderingDefault(false);            Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledException1);            Application.ThreadException+=ThreadException2;            try            {                Application.Run(new Form1());            }            catch(Exception e)            {                Log4Helper.Error(e.Message, e);            }
0 0
原创粉丝点击