Log4Net, как добавить пользовательское поле в мой журнал
Я использую log4net.Приемщика.AdoNetAppender приемщика.
Моя таблица log4net содержит следующие поля [Date],[Thread],[Level],[Logger],[Message],[Exception]
мне нужно будет добавить еще одно поле в таблицу log4net (например, SalesId), но как я могу указать в своем xml и в коде для регистрации "SalesId" при регистрации сообщения об ошибке или информации?
например log.Info("SomeMessage", SalesId)
вот log4net xml
<appender name="SalesDBAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value ="System.Data.SqlClient.SqlConnection" />
<connectionString value="Data Source=..." />
<commandText value="INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="255" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
3 ответов:
1) изменить текст команды:
INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MyColumn]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @CustomColumn)2) Добавьте определение параметра для пользовательского столбца:
<parameter> <parameterName value="@CustomColumn"/> <dbType value="String" /> <size value="255" /> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%property{CustomColumn}" /> </layout> </parameter>3) затем используйте один из контекстов log4net для передачи значений в параметр:
// thread properties... log4net.LogicalThreadContext.Properties["CustomColumn"] = "Custom value"; log.Info("Message"); // ...or global properties log4net.GlobalContext.Properties["CustomColumn"] = "Custom value";
три типа контекста ведения журнала доступны в Log4Net.
такой как log4net.Функции :- данном контексте общая для всех потоков и доменов.Если два потока задают одно и то же свойство в GlobalContext, одно значение будет переопределять другое.
такой как log4net.ThreadContext: - эта область контекста ограничена вызовом потока. Здесь два потока могут установить одно и то же свойство в разные значения без переопределения для каждого другой.
такой как log4net.ThreadLogicalContext: - этот контекст ведет себя аналогично ThreadContext. если вы работаете с пользовательским алгоритмом пула потоков или размещаете среду CLR, вы можете найти некоторое применение для этого.
добавьте в программу следующий код.cs файл:
static void Main( string[] args ) { log4net.Config.XmlConfigurator.Configure(); log4net.ThreadContext.Properties[ "myContext" ] = "Logging from Main"; Log.Info( "this is an info message" ); Console.ReadLine(); }2) Добавьте определение параметра для пользовательского столбца:
<log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> <layout type="log4net.Layout.PatternLayout"> <conversionPattern value="%logger (%property{myContext}) [%level]- %message%newline" /> </layout> </appender> </log4net>
вот рабочая версия с некоторыми персонализированные предпочтения. Я добавил пользовательский столбец для хранения сгенерированного кода исключения.
1) Добавьте свой пользовательский столбец (exceptionCode здесь) в конфигурацию Log4net:
<commandText value="INSERT INTO Log([Date],[Thread],[Level],[Logger],[Message],[Exception],[ExceptionCode]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception,@exceptionCode)" /> <parameter> <parameterName value="@exceptionCode" /> <dbType value="String" /> <size value="11" /> <layout type="Common.Utils.LogHelper.Log4NetExtentedLoggingPatternLayout"> <conversionPattern value="%exceptionCode{Code}" /> </layout> </parameter>2) Log4NetExtentedLoggingCustomParameters.cs
namespace Common.Utils.LogHelper { public class Log4NetExtentedLoggingCustomParameters { public string ExceptionCode { get; set; } public string Message { get; set; } public override string ToString() { return Message; } } }3) Log4NetExtentedLoggingPatternConverter.cs
namespace Common.Utils.LogHelper { public class Log4NetExtentedLoggingPatternConverter : PatternConverter { protected override void Convert(TextWriter writer, object state) { if (state == null) { writer.Write(SystemInfo.NullText); return; } var loggingEvent = state as LoggingEvent; var messageObj = loggingEvent.MessageObject as Log4NetExtentedLoggingCustomParameters; if (messageObj == null) { writer.Write(SystemInfo.NullText); } else { switch (this.Option.ToLower()) //this.Option = "Code" { case "code": //config conversionPattern parameter -> %exceptionCode{Code} writer.Write(messageObj.ExceptionCode); break; default: writer.Write(SystemInfo.NullText); break; } } } } }4) Log4NetExtentedLoggingPatternLayout.cs
namespace Common.Utils.LogHelper { public class Log4NetExtentedLoggingPatternLayout : PatternLayout { public Log4NetExtentedLoggingPatternLayout() { var customConverter = new log4net.Util.ConverterInfo() { Name = "exceptionCode", Type = typeof(Log4NetExtentedLoggingPatternConverter) }; AddConverter(customConverter); } } }5) регистратор.cs / / наслаждайтесь своим регистратором с новая колонка! :)
namespace Common.Utils.LogHelper { public class Logger { static ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); public static string LogError(string message, Exception exception = null) { var logWithErrCode = GetLogWithErrorCode(message); Logger.Error(logWithErrCode, exception); return logWithErrCode.ExceptionCode; } private static Log4NetExtentedLoggingCustomParameters GetLogWithErrorCode(string message) { var logWithErrCode = new Log4NetExtentedLoggingCustomParameters(); logWithErrCode.ExceptionCode = GenerateErrorCode(); //this method is absent for simplicity. Use your own implementation logWithErrCode.Message = message; return logWithErrCode; } } }ссылки:
http://blog.stvjam.es/2014/01/logging-custom-objects-and-fields-with
Comments