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>
%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将操作日志写入数据库>> 敬请期待.