Log4Net 之将日志记录到数据库的配置 (一)
前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析。本来打算着自己下手写一个,后面发现各业务组可能会需要不同的记录方式,比如利用数据库来记录,用txt的文件形式来记录,当然,这些都是最常用的记录方式。而且不同的业务组都希望有自己的记录数据表,不希望和其他业务组的数据混在一起。于是我先前设想的架构方式也就付之一炬了,因为不够灵活,而且实现难度大、周期长。恰在此时想起了之前做项目的时候用的 Log4Net 的开源日志框架,于是又从新Google了一下,发现,真棒。今天我就来给大家介绍一下 Log4Net。
介绍:Log4Net是一个功能著名的开源日志记录组件。通过它可以将.net应用程序的日志记录到多种介质之中,包括:文件、控制台、window事物日志和数据库中(MS SQL Server、Access、Oracle9i、DB2、SQLite)中,并且我们还可以设置和标示日志的级别等。
对于 Log4Net 我想大家都已经不陌生了,所以我就直接奔入主题,我主讲如何进行数据库的配置及自定义表字段(即自定义属性)。关于Log4Net 的配置说明,网上有太多太多的内容了,关于数据库的配置网上也有很多。但是我发现很多都是转来转去,并没有能真正解决数据库配置及自定义表字段的问题,大多数人都出的解决方案也只是拼起来的,不能用。
好了,在.net中使用 Log4Net 来将日志记录到数据库,现在开始:
(1)、我们首先需要一个配置文件,我将其命名为 Log4Net.Config,其内容如下:
<?xml version="1.0"?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/> </configSections> <log4net> <root> <level value="INFO"></level> <appender-ref ref="AdoNetAppender_SQL"/> </root> <logger name="WebLogger"> <level value="INFO"/> <appender-ref ref="ADONetAppender" /> </logger> <logger name="WebTest"> <level value="INFO"/> <appender-ref ref="ADONetTest" /> </logger> <!--SQL数据库--> <appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <bufferSize value="10"/> <!-- SQL数据源 ,本地安装SQL客户端--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <!-- SQL连接字符串--> <connectionString value="data source=SHUJU-BAILING\SQLEXPRESS;initial catalog=LogSys;integrated security=False;persist security info=True;User ID=sa;Password=123456" /> <commandText value="INSERT INTO Log ([RecordTime],[LevelName],[Message],[Exception],[UserID]) VALUES (@log_date, @log_level, @message, @exception, @UserID)"/> <parameter> <parameterName value="@log_date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </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="@exception"/> <dbType value="String"/> <size value="2000"/> <layout type="log4net.Layout.ExceptionLayout"/> </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="Int32" /> <layout type="JJ.Data.LogCommon.CustomLayout"> <conversionPattern value="%UserID" /> </layout> </parameter> </appender> <!--SQL数据库--> <appender name="ADONetTest" type="log4net.Appender.ADONetAppender"> <bufferSize value="10"/> <!-- SQL数据源 ,本地安装SQL客户端--> <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <!-- SQL连接字符串--> <connectionString value="data source=SHUJU-BAILING\SQLEXPRESS;initial catalog=LogSys;integrated security=False;persist security info=True;User ID=sa;Password=123456" /> <commandText value="INSERT INTO LogTest ([RecordTime],[LevelName],[Message],[Exception],[UserID]) VALUES (@log_date, @log_level, @message, @exception, @UserID)"/> <parameter> <parameterName value="@log_date"/> <dbType value="DateTime"/> <layout type="log4net.Layout.RawTimeStampLayout"/> </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="@exception"/> <dbType value="String"/> <size value="2000"/> <layout type="log4net.Layout.ExceptionLayout"/> </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="Int32" /> <layout type="JJ.Data.LogCommon.CustomLayout"> <conversionPattern value="%UserID" /> </layout> </parameter> </appender> <!--<root> <level value="DEBUG" /> <appender-ref ref="ADONetAppender" /> </root>--> </log4net> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> </startup> </configuration>
这是一个非常完整的 Log4Net 的配置文件,细心的同学会发现,我配置了两张一模一样表,是的,这是我为了做测试用的,我想试试他能不能根据不同的业务需要将不同的日志分别记录到不同的表中(实验证明完全没有问题 )。
<logger name="WebLogger"> <level value="INFO"/> <appender-ref ref="ADONetAppender" /> </logger> <logger name="WebTest"> <level value="INFO"/> <appender-ref ref="ADONetTest" /> </logger>
上面的这段配置我想特别强调一下,Logger 配置接点告诉我们,日志信息将分别以ADONetAppender 和 ADONetTest的形式进行输出,而且这两种形式正是我们上面配置的两个表,你仔细观察 appender 配置节的 name 属性,哈哈,是不是一下子就明白了。其实如果我们真正的理解了 Log4Net 配置说明,其实 Log4Net 的使用也就自然而然的掌握了,其它的就是多看一下相应的API文档。