log4net программно меняет цель с текста на базу данных в журнал событий

1

Есть ли способ, чтобы log4net изменял целевое местоположение предполагаемого журнала через определенные условия в программе, без необходимости обновлять и повторно развертывать конфигурацию xml?

Я не хочу никакого зависимого от конфигурации решения. Он должен работать только через код. У меня есть определенные условия, на основе которых я смогу рассказать о своей программе, которую нужно выбрать. При некоторых условиях программа автоматически переключится между текстовым файлом по заранее определенному пути или SQL Server на предопределенный сервер/базу данных или в журнал событий под моим именем приложения. Путь к файлу, строка соединения sql и параметры журнала событий будут единственной вещью, сохраненной в файле конфигурации приложений.

Это даже выполнимо на log4net? Я не мог найти ничего подходящего для того, что я искал, поэтому у меня нет кода, который я могу показать. Большинство ответов касалось того, как изменить местоположение каталога по умолчанию, но это не то, что я хочу.

благодаря

Теги:
log4net
log4net-appender
log4net-configuration
log4net-filter

2 ответа

2
Лучший ответ

Я знаю, что вы говорили об изменении своего приложения только в коде, но я действительно думаю, что вы выиграли бы больше, используя выбранные приложения в зависимости от свойства контекста, заданного в коде

Примером может быть сделать что-то подобное в вашем файле конфигурации:

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender,log4net">

  <filter type="log4net.Filter.PropertyFilter">
    <key value="target" />
    <stringToMatch value="DB" />
    <acceptOnMatch value="true" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />

<!-- your ado configuration -->


<appender name="AnotherAppender" type="log4net.Appender.EventLogAppender,log4net">

  <filter type="log4net.Filter.PropertyFilter">
    <key value="target" />
    <stringToMatch value="EventLog" />
    <acceptOnMatch value="true" />
  </filter>
  <filter type="log4net.Filter.DenyAllFilter" />

<!-- your Eventlog configuration -->

Затем в вашем коде вы можете установить target свойство логгера для нужного адресата:

var isDB = true;
var loggingEvent = new LoggingEvent(typeof(Program), Log.Logger.Repository, Log.Logger.Name, Level.Info, "message", null);
loggingEvent.Properties["target"] = isDB ? "DB" : "EventLog";
Log.Logger.Log(loggingEvent);

Таким образом, у вас нет волшебных выходов регистрации, скрытых в вашем коде, выходы управляются через конфигурацию, поэтому вы можете легко ее изменить, и маршрутизация - это единственное, что вам нужно позаботиться внутри приложения.

Если вам не нужен контекст для каждого сообщения (например, вы знаете, что после внесения изменений в журнал маршрутизации он не будет переключаться снова в течение длительного времени), вы можете использовать один из трех других контекстов, которые можно задать глобально:

  • log4net.GlobalContext используется для всех регистраторов в приложении.
  • log4net.ThreadContext совместно используется регистраторами в одном потоке
  • log4net. ThreadLogicalContext распределяется между регистраторами в тех же логических границах для потока (больше информации о различии)
0

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

Например, это код, который переключает приложения, имеющие имя с префиксом "Аудит".

        private static void ToggleAuditing(bool enabled)
    {
        log4net.Appender.IAppender[] appenders = log4net.LogManager.GetRepository().GetAppenders();

        foreach (log4net.Appender.IAppender app in appenders)
        {
            log4net.Appender.AppenderSkeleton skel = app as log4net.Appender.AppenderSkeleton;

            if (skel != null && app.Name.StartsWith("Audit"))
            {
                skel.Threshold = enabled ? Level.All : Level.Off;
            }
        }
    }
  • 0
    Вам также необходимо вызвать ActivateOptions () для каждого приложения, чтобы использовать новую конфигурацию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню