在ASP.NET中使用Log4NET's ADONetAppender的四个小技巧

本文提供四个实用技巧,帮助开发者在ASP.NET应用程序中更好地利用Log4Net的ADONetAppender,包括配置log4net、调整缓冲区大小、运行时更新连接字符串及使用MDC添加额外信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值