USE [ASPNETDB]GO/****** 对象: Table [dbo].[Log] 脚本日期: 12/21/2011 22:41:53 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOSET ANSI_PADDING ONGOCREATE TABLE [dbo].[Log]( [ID] [int] IDENTITY(1,1) NOT NULL, [Date] [datetime] NOT NULL, [Thread] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [Level] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [Logger] [varchar](200) COLLATE Chinese_PRC_CI_AS NULL, [UserName] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [ControlName] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [ActionName] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [Message] [text] COLLATE Chinese_PRC_CI_AS NULL, [IP] [varchar](20) COLLATE Chinese_PRC_CI_AS NULL, [MachineName] [varchar](100) COLLATE Chinese_PRC_CI_AS NULL, [Browser] [varchar](50) COLLATE Chinese_PRC_CI_AS NULL, [Location] [text] COLLATE Chinese_PRC_CI_AS NULL, [Exception] [text] COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]GOSET ANSI_PADDING OFF
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender,log4net">
<!--BufferSize为缓冲区大小,只有日志记录超设定值才会一块写入到数据库-->
<bufferSize value="10" /><!—或写为<param name="BufferSize" value="10" />-->
<!--引用-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<!--连接数据库字符串-->
<connectionString value="data source=.;initial catalog=Test;integrated security=false;persist security info=True;User ID=sa;Password=;" />
<!--插入到表Log-->
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Operator],[Message],[ActionType],[Operand],[IP],[MachineName],[Browser],[Location],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@operator, @message,@action_type,@operand,@ip,@machineName,@browser,@location,@exception)" />
<!—日志记录时间,RawTimeStampLayout为默认的时间输出格式 -->
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<!--线程号-->
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<!—长度不可以省略,否则不会输出-->
<size value="100" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<!--日志等级-->
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="100" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<!--日志记录类名称-->
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="200" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<!--操作者。这个是自定义的输出字段,使用重新实现的布局器ReflectionLayout -->
<parameter>
<parameterName value="@operator" />
<!—设置为Int32时只有bufferSize的 value<="1"才正确输出,没有找出原因。-->
<dbType value="Int16" />
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<conversionPattern value="%property{Operator}" />
</layout>
</parameter>
<!--操作对象-->
<parameter>
<parameterName value="@operand" />
<dbType value="String" />
<size value="300" />
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<conversionPattern value="%property{Operand}" />
</layout>
</parameter>
<!—IP地址-->
<parameter>
<parameterName value="@ip" />
<dbType value="String" />
<size value="20" />
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<conversionPattern value="%property{IP}" />
</layout>
</parameter>
<!--机器名-->
<parameter>
<parameterName value="@machineName" />
<dbType value="String" />
<size value="100" />
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<conversionPattern value="%property{MachineName}" />
</layout>
</parameter>
<!--浏览器-->
<parameter>
<parameterName value="@browser" />
<dbType value="String" />
<size value="50" />
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<conversionPattern value="%property{Browser}" />
</layout>
</parameter>
<!—日志消息-->
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="3000" />
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<conversionPattern value="%property{Message}" />
</layout>
</parameter>
<!--动作类型-->
<parameter>
<parameterName value="@action_type" />
<dbType value="Int16" />
<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<conversionPattern value="%property{ActionType}" />
</layout>
</parameter>
<!—记录日志的位置-->
<parameter>
<parameterName value="@location" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%location" />
</layout>
</parameter>
<!—异常信息。ExceptionLayout 为异常输出的默认格式-->
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
注意:
向表中输出的字段不能多于数据表本身字段,而反之则可以,但这些多余字段一定使其可以为空,否则便写不到数据库;
输出字段的类型一定是对应数据表字段数据类型可以隐式转换的,而且长度也不能超过,否则也不能写入;
数据表字段设置尽量可以为空,这样可以避免一条日志记录存在空数据导致后面的日志都记录不了。
4.3<logger>的配置
在配置文件<appender>中的配置好了输出的介质,格式,过滤方式,还要定义日志对象<logger>。在框架的体系里,所有的日志对象都是根日志(root logger)的后代。 因此如果一个日志对象没有在配置文件里显式定义,则框架使用根日志中定义的属性。在<root>标签里,可以定义level级别值和Appender的列表。如果没有定义LEVEL的值,则缺省为DEBUG。可以通过<appender-ref>标签定义日志对象使用的Appender对象。<appender-ref>声明了在其他地方定义的Appender对象的一个引用。在一个logger对象中的设置会覆盖根日志的设置。而对Appender属性来说,子日志对象则会继承父日志对象的Appender列表。这种缺省的行为方式也可以通过显式地设定<logger>标签的additivity属性为false而改变。
<root>不显式申明时使用默认的配置。我觉得在使用时不定义<root>,自定义多个<logger>,在程序中记录日志时直接使用<logger>的name来查找相应的<logger>,这样更灵活一些。例如:
<!--同时写两个文件和数据库-->
<logger name="ReflectionLayout">
<level value="DEBUG"/>
<appender-ref ref="HashtableLayout"/>
<appender-ref ref="ReflectionLayout"/>
<appender-ref ref="ADONetAppender"/>
</logger>
4.4关联配置文件
log4net默认关联的是应用程序的配置文件App.config(BS程序是Web.config),可以使用程序集自定义属性来进行设置。下面来介绍一下这个自定义属性:log4net.Config.XmlConifguratorAttribute。
XmlConfiguratorAttribute有3个属性:
ConfigFile: 配置文件的名字,文件路径相对于应用程序目录
(AppDomain.CurrentDomain.BaseDirectory)。ConfigFile属性不能和ConfigFileExtension属性一起使用。
ConfigFileExtension: 配置文件的扩展名,文件路径相对于应用程序的目录。ConfigFileExtension属性不能和ConfigFile属性一起使用。
Watch: 如果将Watch属性设置为true,就会监视配置文件。当配置文件发生变化的时候,就会重新加载。
如果ConfigFile和ConfigFileExtension都没有设置,则使用应用程序的配置文件App.config(Web.config)。
可以在项目的AssemblyInfo.cs文件里添加以下的语句:
//监视默认的配置文件,App.exe.config
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
//监视配置文件,App.exe.log4net。
[assembly: log4net. Config.XmlConfigurator(ConfigFileExtension = "log4net", Watch = true)]
//使用配置文件log4net.config,不监视改变。注意log4net.config文件的目录,BS程序在站点目录//下,CS则在应用程序启动目录下,如调试时在\bin\Debug下,一般将文件属性的文件输出目录调为//始终复制即可
[assembly: log4net. Config.XmlConfigurator(ConfigFile = "log4net.config")]
//使用配置文件log4net.config,不监视改变
[assembly: log4net. Config.XmlConfigurator()]
也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:
//这是在BS程序下,使用自定义的配置文件log4net.xml,使用Server.MapPath("~") + //@"\log4net.xml”来取得路径。 \log4net.xml为相对于站点的路径
// ConfigureAndWatch()相当于Configure(Watch = true)
log4net.Config.XmlConfigurator.ConfigureAndWatch(
new System.IO.FileInfo(Server.MapPath("~") + @"\log4net.xml"));
//这是在CS程序下,可以用以下方法获得:
string assemblyFilePath = Assembly.GetExecutingAssembly().Location;
string assemblyDirPath = Path.GetDirectoryName(assemblyFilePath);
string configFilePath = assemblyDirPath + " ";
log4net.Config.XmlConfigurator.ConfigureAndWatch(
new FileInfo(configFilePath));
或直接使用绝对路径:
//使用自定义的配置文件,直接绝对路径为:c:/log4net.config
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(@"c:/log4net.config"));
转自: