整理下log4net日志

今天整理了下log4net日志,记录一下。。。

日志是一个系统排错的重要组成,有在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net、NLog、CommonLogging......

说下Log4net,它是.net平台上的一个日志框架,我接触的时间也不长,但是看着各开源库都在用这个于是前段时间也尝试去了解了一下,然后在自己的练手项目上试试看。

首先让我认识到Log4net强大的地方就是它的多目标输出,可以输出到控制台、文件、数据库、系统事件、Email等,几乎无所不能。然后它可以通过配置让日志系统实时生效,比如说在服务运行的过程中修改配置改变输出目标,改变日志等级等,均不用重启程序。但是Log4net也有一个让我比较头痛的地方就是感觉配置过于复杂,根本记不住,每次都必须去查阅资料。

先说下Log4net的基本配置结构:

<?xml version="1.0"?>
<configuration>

  <configSections>
  <!--log4配置节-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net> 
    
  

  </log4net>
</configuration>

基本都机构就是这样 ,configuration节点里面包含configSection、log4net,这两个节点需要放在最前面。

接下来就是配置了☞<?xml version="1.0"?>

<configuration>

  <configSections>
  <!--log4配置节-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net> 
    <!--根配置--> 
    <root>

      <!--日志级别:可选值: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL -->

      <level value="ALL"/>

      <!--输出到调试日志: Debug.log-->
      <appender-ref ref="DebugAppender"/>
      <!--输出到信息日志: Info.log-->
      <appender-ref ref="InfoAppender"/>
       
        <!--假装这里有多种日志--> 


      <!--数据库日志-->
      <!--<appender-ref ref="SqlAppender"/>-->
    </root>
  </log4net>
</configuration>

 在log4net节点中有root根节点(log4net节点下支持的子元素有:appender,logger,renderer,root,param ,其中root只能有一个,其他的0个或多个),root节点下有一个<level value="ALL"/>节点,它表示日志级别为ALL(ALL级别最低,可记录日志级别高于它的级别)

<!--日志级别:可选值: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL --> 

appender-ref节点都ref是要引用的appender的名字,下文中的appender name="DebugAppender"就是对于<appender-ref ref="DebugAppender"/>这个级别都输出日志的配置。

接下来就是各级别的详细输出配置:

<configuration>

  <configSections>
  <!--log4配置节-->
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
  </configSections>

  <log4net> 
    <!--根配置--> 
    <root> 

      <!--日志级别:可选值: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL --> 

      <level value="ALL"/> 

      <!--输出到调试日志: Debug.log-->
      <appender-ref ref="DebugAppender"/> 
      <!--输出到信息日志: Info.log--> 
      <appender-ref ref="InfoAppender"/>
       
        <!--假装这里有多种日志--> 


      <!--数据库日志--> 
      <!--<appender-ref ref="SqlAppender"/>--> 
    </root>

     <!--Debug.log-->
     <appender name="DebugAppender" type="log4net.Appender.RollingFileAppender,log4net">
       <!--过滤-->
      <filter type="log4net.Filter.LevelRangeFilter">
      <param name="LevelMin" value="DEBUG" />
      <param name="LevelMax" value="DEBUG" />
      </filter>
      <!--目录路径,可以是相对路径或绝对路径-->
      <param name="File" value="c:/log/manage/debug/"/>
      <!--文件名,按日期生成文件夹-->
      <param name="DatePattern" value="/yyyy-MM-dd/&quot;debug.log&quot;"/>
      <!--追加到文件-->
      <appendToFile value="true"/>
      <!--创建日志文件的方式,可选值:Date[日期],文件大小[Size],混合[Composite]-->
      <rollingStyle value="Composite"/>
      <!--写到一个文件-->
      <staticLogFileName value="false"/>
      <!--单个文件大小。单位:KB|MB|GB-->
      <maximumFileSize value="2MB"/>
      <!--最多保留的文件数,设为"-1"则不限-->
      <maxSizeRollBackups value="-1"/>
      <!--日志格式-->
      <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%message"/>
      </layout>
     </appender>

  </log4net>
</configuration>

注意<appender></appender>节点都type,RollingFileAppender代表的是将日志以回滚文件的形式写到文件中,想这样类型很多,网上搜下就找得到,按照情况配置类型即可。

然后配置过滤级别、文件地址、文件名、是否写入到一个文件中、文件大小、文件数。

然后是日志格式,可以像这样自己定义一个格式:

<layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%newline %n记录时间:%date %n线程ID:[%thread] %n日志级别:  %-5level %n出错类:%logger property: [%property{NDC}] - %n错误描述:%message%newline %n"/>
</layout>

别急!!!还有一个数据库日志:

<appender name="SqlAppender" type="log4net.Appender.AdoNetAppender">

  <filter type="log4net.Filter.LevelRangeFilter">
    <param name="LevelMin" value="INFO"/>
    <param name="LevelMax" value="FATAL"/>
  </filter>

  <!--缓冲区大小,值为100表示输出日志达到100条时才一次写入数据库,1表示不缓存-->
  <bufferSize value="100" />
  <!--连接组件类型-->
  <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  <!--连接字符串-->
  <connectionstring value="server=.sql2005;database=Log;uid=sa;pwd=123" />
  <!--SQL语句-->
  <commandText value="INSERT INTO SysLogs
    ([Date],[Thread],[Level],[Logger],[Message],[Exception])
     VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<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="50" />
      <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="@exception" />
      <dbType value="String" />
      <size value="2000" />
      <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
</appender>

注意type是AdoNetAppender,然后下面配置过滤级别缓冲区、链接组件类型、数据库的连接字符串、SQL语句;

SQL语句下面都parameter节点是获取日志中的信息给到SQL。


原文地址:https://www.cnblogs.com/zousc/p/11152981.html