今天整理了下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/"debug.log""/>
<!--追加到文件-->
<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。