我使用AdoNetAppender进行数据库日志记录。我想要做的是在每个日志语句上记录用户身份。但是,我不想使用标准log4net%标识参数,原因有两个:使用自定义参数log4net数据库日志记录
- log4net警告说,它非常慢,因为它必须查找上下文标识。
- 在一些服务组件中,标准标识是服务帐户,但我们已经在变量中捕获了用户标识,我希望使用它。
我看过代码,其中一些人使用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;
}
}
,然后以编程内容添加到当前的appender像这样:
ILog myLog = LogManager.GetLogger("ConnectionService");
IAppender[] appenders = myLog.Logger.Repository.GetAppenders();
AdoNetAppender appender = (AdoNetAppender)appenders[0];
appender.AddParameter(new UserAdoNetAppenderParameter());
myLog.InfoFormat("{0}~{1}~{2}~{3}", userName, "ClassName", "Class Method", "Message");
这样做的目的是使用标准格式用于消息并解析字符串的第一部分,该部分始终应该是用户名。自定义appender参数的FormatValue()方法应该只使用该部分字符串,以便可以将其写入日志数据库中的单独字段。
我的问题是没有日志语句写入数据库。奇怪的是,当调试时,FormatValue()方法中的断点仅在我停止服务时才会被触发。
我已经浏览了大量与此相关的内容,但还没有找到任何答案。 有没有人设法做到这一点,或者我在错误的轨迹上。 P.S.我也尝试过扩展AdoNetAppender,但它不允许你设置参数值。
我很喜欢log4net,我有窗口虽然我们将用户名作为字符串传递,但解决方案中没有访问HttpContext的服务组件。我不想设置ThreadContext属性,每次需要记录日志时记录并取消设置。我希望扩展AdoNetAppenderParameter会照顾它。感谢您的建议。 – 2012-07-15 11:46:05