Log4Net, как добавить настраиваемое поле в мой журнал

Я использую app log4net.Appender.AdoNetAppender.
Моя таблица log4net представляет собой следующие поля: [Date],[Thread],[Level],[Logger],[Message],[Exception]

Мне нужно было бы добавить другое поле в таблицу log4net (например, SalesId), но как бы я указал в своем xml и в коде для регистрации «SalesId» при регистрации сообщения об ошибке или информации?

например log.Info("SomeMessage", SalesId)

Вот log4net xml

                                                   

1) Измените текст команды: INSERT INTO Log4Net ([Date],[Thread],[Level],[Logger],[Message],[Exception],[MyColumn]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception, @CustomColumn)

2) Добавьте определение параметра для настраиваемого столбца:

         

3) Затем используйте один из контекстов log4net для передачи значений в параметр:

 // thread properties... log4net.LogicalThreadContext.Properties["CustomColumn"] = "Custom value"; log.Info("Message"); // ...or global properties log4net.GlobalContext.Properties["CustomColumn"] = "Custom value"; 

Три типа контекста ведения журнала доступны в Log4Net.

  1. Log4Net.GlobalContext: – Этот контекст используется для всех streamов приложений и доменов. Если два streamа устанавливают одно и то же свойство в GlobalContext, одно значение переопределяет другое.

  2. Log4Net.ThreadContext: – Этот контекстный контекст ограничен вызывающим streamом. Здесь два streamа могут устанавливать одно и то же свойство в разные значения без переопределения друг друга.

  3. Log4Net.ThreadLogicalContext: – Этот контекст ведет себя аналогично ThreadContext. если вы работаете с пользовательским алгоритмом пула streamов или размещаете CLR, вы можете найти его для этого.

Добавьте следующий код в файл program.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) Добавьте определение параметра для настраиваемого столбца:

         

Вот рабочая версия с некоторыми индивидуальными предпочтениями. Я добавил специальный столбец для хранения генерируемого кода исключения.

1) Добавьте свой собственный столбец (exceptionCode здесь) в конфигурацию Log4net:

          

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) Logger.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

  • log4net - Агенты не работают в IIS7.5
  • Log4net не записывает файл журнала
  • Ссылка на 2 разных версии log4net в одном решении
  • Выход Log4net xml
  • При использовании оболочки, как сохранить имя classа и метода для Log4Net для регистрации?
  • Как регистрировать имя метода при обертке Log4net?
  • Log4Net Регистрация двух разных уровней для двух разных приложений для одного и того же регистратора
  • Как выглядит class Wrapper Log4Net?
  • Log4Net: установите максимальные резервные файлы на RollingFileAppender со скользящей датой
  • Сообщения Log4Net «Не удалось найти информацию о схеме»
  • Как я могу изменить расположение файла программным путем?
  • Interesting Posts

    Windows 10: изменение сочетаний клавиш для переключения между рабочими столами

    MS Security Essentials не обновляется автоматически

    Rsync-подобная автоматическая дельта-резервная копия съемного жесткого диска на окнах

    Как получить числа после десятичной точки?

    Управление цветом: как откалибровать монитор?

    Война с весенними ботинками без встроенного tomcat

    Кнопка мыши и счетчик клавиш для Windows

    Как отсортировать вектор символа, где элементы содержат буквы и числа в R?

    Поделитесь Интернетом через ноутбук Dell Windows 7

    Как установить плагин C ++ в Eclipse?

    Есть ли способ заставить отчет сообщить размер каталога (рекурсивно), включая только размеры файлов?

    Как заставить RelativeLayout работать с объединением и включать?

    Виртуализация элемента управления ItemsControl?

    Системная ошибка 58 при доступе к общим ресурсам Windows 7 с XP

    Что такое опция «sameq» или «same_quant» в FFmpeg? Означает ли это «такое же качество»?

    Давайте будем гением компьютера.