我使用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