Ведение журнала нескольких экземпляров приложения передовой опыт? - PullRequest
14 голосов
/ 20 апреля 2011

Я наконец-то попробовал log4net для своего настольного WPF-приложения.

Я борюсь с тем фактом, что RollingFileAppender не имеет встроенной поддержки для приложения с несколькими экземплярами.

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

Использование идентификатора процесса в имени файла журнала также недостаточно. Это может поглотить неограниченное пространство, так как RollingFileAppender бесполезен в этой ситуации.

Возможно, одним из решений будет отправка журналов другому процессу, который позаботится о сериализации вывода в файлы. Но это создает новые головные боли.

Что вы думаете об этом?

Ответы [ 2 ]

17 голосов
/ 20 апреля 2011

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

У вас есть несколько вариантов здесь:

Несколько FileAppender с минимальной блокировкой

Использовать несколько FileAppender экземпляров, указывающих на один и тот же файл и настроенных с минимальной блокировкой.Это позволит одновременно выполнять операции записи из нескольких процессов:

<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="Log.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern
            value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
</appender>

Несколько EventLogAppender

Использовать несколько EventLogAppender экземпляров, которые записывают в общий источник событий Windows:

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
    <applicationName value="MyApp" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern
            value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
</appender>

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

Связанные ресурсы:

1 голос
/ 30 января 2016

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

Просто убедитесь, что вы изменили путь до того, как произойдет запись в журнал. В противном случае можно использовать конфигурацию, аналогичную «Multiple FileAppender с минимальной блокировкой» из предыдущего ответа.

...