【.NET】log4net配置文件解析

       

          Log4Net是一个开源日志记录组件,将log4net.dll引入到项目References中,通过它可以将.net应用程序的日志记录到多种介质之中,并且我们还可以设置和标示日志的级别等。


        然后我们从配置文件入手,我们可以将配置写在web.config,也可以写到一个单独的配置文件中,可以命名为log4net.config.使用log4net需要知道其中两个比较重要的概念:logger 和 appender。logger是日志记录对象,后者是日志记录的目标也就是控制台,文件,数据库等。使用时,先获得一个用来记录日志的工具对象logger,然后为logger对象指定日志的记录位置.这就是配置文件为我们做好的事.


先看一个我写好的配置.


技术分享

       

       我将配置文件写在了一个单独的文件中,这样有两点好处:

           l 不需要重新编译源代码就能改变配置; 

        2 可以在程序正运行的时候就改变配置。(这一点在一些Web程序和远程过程调用的程序中很重要)


          后来因为我们的ITOO项目太大,这样写配置文件需要多个子系统分别维护,我就把做的这部分放到了资源文件中,和项目一起打包成dll,统一让各系统引用.这样一来改变配置文件需要重新引用,不过比起多方维护,更能减少出错.

         我在这里配置了多个logger,各系统调用时传来不同的参数,loggerName,就可以实现每个系统的异常将被写入到单独的文件中或数据库表中.

如 


1.将异常日志写到文件

<!--权限系统-->
    <logger name="AuthoritySystem">
      <level value="ALL"/>
      <appender-ref ref="AuthoritySystemFileAppender"/>
    </logger>

<!--权限系统-->
    <appender name="AuthoritySystemFileAppender" type="log4net.Appender.RollingFileAppender, log4net">
      <!--文件夹名-->
      <param name="File" value="c:\log\AuthoritySystemLog\Exception\" />
      <param name="AppendToFile" value="true" />
      <!--根据日志创建最新的-->
      <param name="RollingStyle" value="Date" />
      <!--文件名的格式-->
      <param name="DatePattern" value=""Logs_"yyyy-MM-dd".txt"" />
      <!--文件名动态生成-->
      <param name="StaticLogFileName" value="false" />
      <!--日志内容的格式-->
      <layout type="log4net.Layout.PatternLayout,log4net">
        <!--<param name="ConversionPattern" value="%d %newline [%t%] %-5p %c - %m%n" />-->
        <param name="ConversionPattern" value="时间: %d 线程ID: [%t%] 日志级别: %-5p 出错系统名: %c - 出错描述: %m%n" />
        <param name="Header" value="
---------Header---------
" />
        <param name="Footer" value="
---------Footer---------
" />
      </layout>

    </appender> 



log4net.Layout.PatternLayout中的转换模式在上面的文件中作了解释,(ConversionPattern)  

%m(message):输出的日志消息,如ILog.Debug(?)输出的一条消息  

%n(new line):换行  

%d(datetime):输出当前语句运行的时刻  

%r(run time):输出程序从运行到执行到当前语句时消耗的毫秒数  

%t(thread id):当前语句所在的线程ID  

%p(priority): 日志的当前优先级别,即DEBUG、INFO、WARN?等

  %c(class):当前日志对象的名称 

 

2.将操作日志写入到数据库


<!--权限系统-->
    <logger name="AuthoritySystem">
      <level value="Info"/>
      <appender-ref ref="AuthoritySystemAdoNetAppender"/>
    </logger>

 <!--SqlServer数据库-->
    <!--权限系统-->
    <appender name="AuthoritySystemAdoNetAppender" type="log4net.Appender.AdoNetAppender">
      <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
      <connectionString value="server=192.168.24.118;database=Log;user id=sa;password=7027"/>
      <commandText value="INSERT INTO AuthoritySystem (Datetime,Thread,Log_Level,Logger,Message,userid,username,ip,clazz,method,result) VALUES (@log_date, @thread, @log_level, @logger, @message,@userid,@username,@ip,@clazz,@method,@result)"/>
      <bufferSize value="1"/>
      <!--默认已有的成员 -->
      <parameter>
        <parameterName value="@log_date"/>
        <dbType value="DateTime"/>
        <layout type="log4net.Layout.RawTimeStampLayout"/>
      </parameter>
      <parameter>
        <parameterName value="@thread"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%thread"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@log_level"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%level"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@logger"/>
        <dbType value="String"/>
        <size value="255"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%logger"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@message"/>
        <dbType value="String"/>
        <size value="4000"/>
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%message"/>
        </layout>
      </parameter>
      <!--自定义成员 -->
       <parameter>
        <parameterName value="@userid"/>
        <dbType value="String"/>
        <size value="50"/>        
        <layout type="LogDB.CustomLayout">
          <conversionPattern value="%userid"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@username"/>
        <dbType value="String"/>
        <size value="20"/>
        <layout type="LogDB.CustomLayout">
          <conversionPattern value="%username"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@ip"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="LogDB.CustomLayout">
          <conversionPattern value="%ip"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@clazz"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="LogDB.CustomLayout">
          <conversionPattern value="%clazz"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@method"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="LogDB.CustomLayout">
          <conversionPattern value="%method"/>
        </layout>
      </parameter>
      <parameter>
        <parameterName value="@result"/>
        <dbType value="String"/>
        <size value="50"/>
        <layout type="LogDB.CustomLayout">
          <conversionPattern value="%result"/>
        </layout>
      </parameter>
    </appender>


        Log4net默认数据表中有Datetime,Thread,Log_Level,Logger,Message这五个字段,我的数据库名为Log,表名为各系统名,按照系统日志记录要求,又加了id,userid,username,ip,clazz,method,result几个字段.数据表结构现在是12个字段,提前在数据库定义.

 

<bufferSizevalue="1"/>

该属性设置缓存区大小, 1表明有1条日志就写入数据库, 如果是10就表示日志到达10条时一起写入.

 

          Log4net使用过程中关于配置文件的内容就先写到这里,更多内容下一篇博客

<<Log4net将操作日志写入数据库>>  敬请期待.



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。