相关疑难解决方法(0)

使用自定义参数记录log4net数据库

我使用AdoNetAppender进行数据库日志记录.我想要做的是在每个日志语句上记录用户身份.但是,我不想使用标准的log4net%identity参数有两个原因:

  1. log4net警告它非常慢,因为它必须查找上下文标识.
  2. 在某些服务组件中,标准标识是服务帐户,但我们已经在变量中捕获了用户标识,我想使用它.

我见过一些代码,其中一些人使用log4net.ThreadContext来添加其他属性,但我知道由于线程交错这是"不安全"(并且它也是性能消耗).

我的方法是扩展AdoNetAppenderParameter类:

public class UserAdoNetAppenderParameter : AdoNetAppenderParameter
{

    public UserAdoNetAppenderParameter()
    {
        DbType = DbType.String;
        PatternLayout layout = new PatternLayout();
        Layout2RawLayoutAdapter converter = new Layout2RawLayoutAdapter(layout);
        Layout = converter;
        ParameterName = "@username";
        Size = 255;
    }


    public override void Prepare(IDbCommand command)
    {            
        command.Parameters.Add(this);
    }


    public override void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
    {            
        string[] data = loggingEvent.RenderedMessage.Split('~');
        string username = data[0];
        command.Parameters["@username"] = username;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后以编程方式将其添加到当前的appender,如下所示:

ILog myLog = LogManager.GetLogger("ConnectionService");
IAppender[] appenders = myLog.Logger.Repository.GetAppenders();
AdoNetAppender appender = (AdoNetAppender)appenders[0];                    

appender.AddParameter(new …
Run Code Online (Sandbox Code Playgroud)

c# database log4net

8
推荐指数
2
解决办法
2万
查看次数

标签 统计

c# ×1

database ×1

log4net ×1