4 Tips for using Log4NET's ADONetAppender in ASP.NET
技巧1:在Application_Start 中配置log4net
在你的web.config中添加完log4net configSection和appenders后,在Global.asax的Application_Start中添加如下代码:
log4net.Config.DOMConfigurator.Configure();
技巧2:在ADONetAppender配置中,将bufferSize 设置成1.
许多示例都将bufferSize设置成100,这意味着没有任何log会写入到数据库的Log表中直至累计生成100条log信息。这大概是大部分开发者认为ADONetAppender没有正常工作的原因。
技巧3:在运行时改变appnder的配置
ADONetAppender有个connectionString配置, 它包含了Log表所在的数据库连接字符串。然而,大部分web应用已经在web.config(如appSettings)中某处定义了connectionString,但你又不想多次定义connectionString。假设logger的名字是‘MyProject’, 并且包含一个ADONetAppender的引用:
<logger name="MyProject">
<appender-ref ref="ADONetAppender" />
</logger>
现在你可以在Application_Start(在Global.asax中)里添加一段代码,这样在运行时可以获取web.config中appSetting的“MyConnectionString”, 并以此来改变ADONetAppender的connectionString:
// Get the Hierarchy object that organizes the loggers
log4net.Repository.Hierarchy.Hierarchy hier =
log4net.LogManager.GetLoggerRepository() as log4net.Repository.Hierarchy.Hierarchy; if (hier != null)
{
//get ADONetAppender
log4net.Appender.ADONetAppender adoAppender =
(log4net.Appender.ADONetAppender)hier.GetLogger("MyProject",
hier.LoggerFactory).GetAppender("ADONetAppender");
if (adoAppender != null)
{
adoAppender.ConnectionString =
System.Configuration.ConfigurationSettings.AppSettings["MyConnectionString"];
adoAppender.ActivateOptions(); //refresh settings of appender
}
}
技巧4:使用log4net MDC(Mapped Diagnostic Context) 在Log表中添加额外的信息
ADONetAppender非常容易扩展。如果你想把当前用户写入到Log表,可以按照以下三步来操作:
1. 添加一个新列 ‘User' 到 Log 表
2. 当写日志信息时,使用 MDC.Set("user", ...) 添加用户名到 log4net context
3. 修改web.config中 的 commandText 并且添加user name 参数(转换形式: %X{user})
log4net MDC.Set() 代码:
public void LogError (string message, Exception e)
{
//get logger
ILog logger = LogManager.GetLogger("MyProject"); //set user to log4net context, so we can use %X{user} in the appenders
if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated)
MDC.Set("user", HttpContext.Current.User.Identity.Name); if (logger.IsErrorEnabled)
logger.Error(message, e); //now log error
}
web.config 中 appender:
<!--
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (1, 1) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] (255) NOT NULL,
[Level] [varchar] (50) NOT NULL,
[Logger] [varchar] (255) NOT NULL,
[User] [varchar] (50) NULL,
[Message] [varchar] (4000) NOT NULL,
[Exception] [varchar] (2000) NULL
)
-->
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="[we will set this automatically at runtime]" />
<commandText value="INSERT INTO Log ([Date],[Level],[Logger],[User],[Message],[Exception])
VALUES (@log_date, @log_level, @logger, @user, @message, @exception)" />
<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="%p" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%c" />
</layout>
</parameter>
<parameterName value="@user" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{user}" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
|