Нужен совет по ведению журнала на стороне сервера с помощью log4net

Мы используем log4net для ведения журналов на стороне сервера. Проблема, с которой мы столкнулись, связана с FileAppender. Вот наш раздел log4net в файле app.config:

  <log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <appender name="MainAppender" type="log4net.Appender.FileAppender">
      <lockingMode type="log4net.Appender.FileAppender+MinimalLock" />
      <file value="${TMP}\Shunra.Infra.Test.Host.log" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ERROR" />
      <appender-ref ref="MainAppender" />
    </root>
  </log4net>

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

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

Спасибо.


person mark    schedule 10.12.2009    source источник
comment
Не могли бы вы показать нам код, который ведет журнал?   -  person Peter Lillevold    schedule 13.12.2009
comment
Это действительно тривиально. Когда мы хотим что-то записать, мы просто пишем LogManager.GetLogger (GetType ()). Debug (...)   -  person mark    schedule 13.12.2009


Ответы (3)


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

Тот факт, что ваш файл журнала находится в папке TEMP (где многие процессы выполняют свою временную работу), увеличивает риск "подделки" вашего файла журнала другими процессами.

Мой совет в вашем сценарии:

  1. Используйте RollingFileAppender. Это более масштабируемое приложение, когда дело доходит до обработки больших объемов журналов.
  2. Создайте специальную папку для файлов журнала.
  3. Используйте ExclusiveLock по умолчанию для повышения производительности журнала.
person Peter Lillevold    schedule 11.12.2009
comment
Согласен, проблема в MinimalLock - person csharptest.net; 11.12.2009
comment
Ребят, а лог файл никто не пишет, кроме сервера. Однако существует несколько потоков, записывающих один и тот же файл журнала. Ошибка указывает на то, что потоку не удается получить блокировку, поскольку ее записывает другой поток. Если я сделаю исключительную блокировку, тогда только один поток будет записывать файл журнала когда-либо. Это не нужно. - person mark; 11.12.2009
comment
Тогда что-то не так. log4net является потокобезопасным, поэтому у вас должно быть все в порядке с несколькими потоками, ведущими журнал ... - person Peter Lillevold; 12.12.2009
comment
@mark - вы когда-нибудь выясняли причину проблемы с блокировкой? - person Peter Lillevold; 12.09.2012

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

person RichardOD    schedule 10.12.2009
comment
Вход в базу данных с помощью AdoNetAppender также является жизнеспособным вариантом. - person Peter Lillevold; 11.12.2009

Мы используем log4net для наших многопоточных приложений. Никогда не вызывает проблем, у нас нет раздела ‹lockMode>.

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

person Carra    schedule 10.12.2009
comment
Нет, только один сервер с несколькими потоками. Можно ли удалить элемент lockMode? Как будет выглядеть результат, если два потока одновременно будут писать в один и тот же файл? Будет ли вывод обоих потоков чередоваться с тарабарщиной? - person mark; 10.12.2009
comment
@mark - log4net внутренне обрабатывает сериализацию сообщений журнала в приложении, поэтому нет, это не будет лишним, каждое сообщение журнала добавляется к файлу построчно - person Peter Lillevold; 11.12.2009
comment
Итак, я могу полностью избавиться от элемента lockMode? - person mark; 11.12.2009