log4net, могут ли 2 приложения писать в один и тот же лог-файл?

Возможно ли, чтобы 2 приложения записывали в один и тот же файл журнала с помощью log4net?


person JL.    schedule 06.04.2010    source источник


Ответы (5)


Они могут, но если одно приложение записывает файл, другое приложение, скорее всего, столкнется с ошибкой, если ему также потребуется запись в журнал, из-за того, что первое приложение будет держать файл открытым для записи. Всегда лучше иметь выделенные источники журналов для ваших приложений — если вам нужно поделиться журналом, используйте базу данных, так как она предназначена для обработки параллельных записей.

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

person Andrew Hare    schedule 06.04.2010

MinimalLock частично решает проблему (как упоминал @Mark), но если вы используете RollingFileAppender, вы столкнетесь с другими проблемами. При переносе файла вы можете оказаться в состоянии гонки, когда один процесс перезаписывает только что созданный файл журнала другого процесса.

Другие варианты включают RemoteLogger, где у вас есть простой сервер, настроенный для получения и записи событий регистрации, отправленных другими процессами. Точно так же вы можете войти в базу данных SQL. Я написал простое добавление, которое регистрируется в Redis; вам понадобится простое приложение для чтения из Redis и записи в файл. Проблема этих подходов в том, что все они создают точку отказа. Когда что-то работает неправильно, часто именно тогда вам больше всего нужны журналы, и тогда они могут быть недоступны.

Поэтому мое решение состояло в том, чтобы полностью избежать этой проблемы, записав каждый процесс в свой собственный файл. Это было легко сделать с изменением конфигурации. В вашей конфигурации (Rolling)FileAppender используйте:

<file type="log4net.Util.PatternString" value="c:\mylog-[%processid].txt" />

Идентификатор процесса становится частью имени файла. Да, это означает, что теперь у вас есть несколько файлов журналов, которые нужно просмотреть, но вам может помочь агрегатор файлов журналов, такой как Graylog, Splunk или Logscape.

person Jimothy    schedule 16.10.2012
comment
Итак, если у меня есть API, который вызывается с веб-сайта, но может быть много раз одновременно, сможет ли %processid справиться с ошибкой записи в журнал? Если по какой-то причине это не удается, останавливает ли остальную часть кода выполнение или продолжает выполнять остальную часть кода в вызове API? - person Si8; 17.04.2018
comment
@Si8: Я давно не работал в .NET, но я считаю, что log4net изящно обработает ошибки при ведении журнала. То есть сбой в журнале не приведет к тому, что остальная часть кода не будет работать. Но вы должны протестировать и проверить это (например, но заблокировав целевой файл). Что касается многократного вызова, я не думаю, что это также вызовет ошибку, но опять же, проверьте это. %processid может быть одинаковым для нескольких потоков в одном процессе, но я считаю, что log4net справляется с этим нормально. Я думаю, ты будешь в порядке; доверять, проверяя. - person Jimothy; 17.04.2018
comment
Спасибо, @Jimothy ... Я проверил это, поэтому журналы носят спорадический характер, что означает, что если API вызывается одновременно, журнал находится повсюду. Одно не заканчивается до начала остальных. - person Si8; 17.04.2018
comment
Очень полезный пост. - person Pažout; 31.07.2018

Это зависит от FileAppender LockingModel. Если это ExclusiveLock, то другой процесс не может открыться файл для записи. Альтернативой является MinimalLock, но это не так. предназначен для этой цели. Он предназначен для того, чтобы разрешить другому процессу перемещать или удалять файл.

person Mark Byers    schedule 06.04.2010
comment
Кто-нибудь может поделиться опытом по этому методу? - person SandRock; 16.01.2012

Да, это возможно, как указано выше, но сейчас я провел стресс-тестирование этого сценария.

Настройка довольно проста:

  1. Веб-проект 1 настроен со страницей, которая регистрирует одну запись + кнопку, которая запускает 1000 запросов на одну и ту же страницу, со счетчиком в URL-адресе (собранным оператором ведения журнала).
  2. Веб-проект 2 настроен идентично с тем же файлом журнала.

При одновременном нажатии обеих кнопок записи журнала перемежаются по всему журналу. НО, и это большой GOTCHA, судя по прилагаемому счетчику запросов, понятно, что есть условия гонки. Почти каждый раз, когда одному веб-проекту удается зарегистрировать свою запись, другой терпит неудачу (запись пропускается).

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

Тест был выполнен со значением по умолчанию «MinimalLock». Я также повторил тест с «ExclusiveLock», только чтобы обнаружить, что первый веб-проект, настроивший регистратор, «выиграл», в основном заблокировав ВСЕ другие запросы на регистрацию. Так что, очевидно, это тоже недопустимо.

person Morten Grøtan    schedule 20.05.2016

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

person Svilen Varbanov    schedule 05.03.2014