Почему дата добавляется дважды к именам файлов при использовании Log4Net?

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

Например, вместо log.2009-02-23.log, я получаю log.2009-02-23.log.2009-02-23.log.

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

Мой конфиг log4net:

<log4net>
<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
    <file value="../../Logs/Mylog"/>
    <staticLogFileName value="false" />
    <appendToFile value="true"/>
    <rollingStyle value="Date"/>
    <datePattern value=".yyyy-MM-dd.lo\g" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%d{DATE} [%t] %-5p %c - %m%n"/>
    </layout>
</appender>
<root>
    <level value="INFO"/>
    <appender-ref ref="MyLog"/>
</root>
</log4net>

Есть идеи почему?

Изменить: я хочу добавить информацию о среде, в которой я тестирую это.
- asp.net
-.net Framework 2.0
Windows Server 2003 64-разрядный пакет обновления 2
- log4net 1.2.10

6 ответов

Решение

Это проблема разрешения. По крайней мере, это то, что происходит со мной.

Я новичок в использовании Log4Net, поэтому я не знал, что у него есть внутренняя регистрация, но я нашел ее, поэтому я попытался включить внутреннюю регистрацию. Я не был уверен, что он говорит, но вот как он выглядит для меня: 1. Добавьте дату к имени файла. 2. Попробуйте получить доступ к файлу для записи в него (не удалось). 3. Добавьте дату к имени файла снова. 4. Успешный доступ к файлу (который теперь имеет странное имя файла)

Прежде чем я узнал об этом, я пытался найти решение этой проблемы с помощью ключевых слов, подобных тому, что у меня есть в качестве заголовка для этого вопроса stackru. Там не было так много информации там. Я нашел, может быть, одного парня, который сказал, что это случается с некоторыми людьми, но так и не объяснил, почему, ни решение. С этой новой информацией (+ внутреннее сообщение об ошибке из Log4Net) я просматривал различные темы от поисковых систем. При этом я обнаружил подсказки, что это может быть проблема с разрешением.

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

Если кто-то может объяснить это лучше меня, пожалуйста, не стесняйтесь редактировать.

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

Проверьте свой код на наличие дублирующих вызовов init4 log4net - возможно, вы инициализируете в конструкторе, а не в статическом конструкторе синглтона или глобальном init, например.

Это также может произойти, если вы работаете в конфигурации "веб-сада" и не включаете PID в имя файла, потому что каждый процесс веб-сервера пытается выполнить запись в один и тот же файл. При использовании веб-садов и записи в файлы добавьте pid к шаблону имени файла, чтобы каждый процесс сервера получил свой собственный файл.

Я сталкиваюсь с той же проблемой. Для меня это была комбинация использования RollingFileAppender для моих журналов испытаний и запуска моих тестов NUnit с ReSharper.

Оказывается, что ReSharper использует два процесса для запуска тестов:

2 TaskRunners

который создает условие гонки в файле журнала.

Теперь, если мы изменим имя файла журнала, чтобы включить идентификатор процесса:

<appender name="MyLog" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString" value="MyLog.pid.%processid" />
  <appendToFile value="true" />
  <rollingStyle value="Composite" />
  <maxSizeRollBackups value="10" />
  <maximumFileSize value="10MB" />
  <staticLogFileName value="false"/>
  <datePattern value="_yyyy-MM-dd'.log'"/>
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%d{HH:mm:ss.fff} [%15.15t] %-5p '%40.40c' - %m%n" />
  </layout>
</appender>

проблема решена. Каждый файл получает свое уникальное имя:

MyLog.pid.5440_2010-10-13.log
MyLog.pid.1496_2010-10-13.log

Обратите внимание на использование PatternString для "type".

Надеюсь, это поможет.

Я использую следующее:

<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/>

С этим я получаю имена файлов, такие как: 2009.02.23.log

Как указала Олле. Ваша проблема связана с '\g', который ваш log4net интерпретирует как другой формат даты. Попробуйте удалить ".yyyy-MM-dd.lo\g" и заменить его на "yyyy-MM-dd"

".Log" не принадлежит формату даты

Пытаться <datePattern value=".yyyy-MM-dd.lo\g" /> Я не понимаю, для чего \g.

Другие вопросы по тегам