Почему дата приложена дважды при именах файлов при использовании Log4Net?
Я пытался добавить дату в мое имя файла журнала, и я смог заставить ее работать, выполнив несколько предложений, которые я нашел в stackoverflow. Все работает нормально, но по какой-то причине первый файл всегда имеет дату, добавленную дважды.
Например, вместо log.2009-02-23.log, я получаю log.2009-02-23.log.2009-02-23.log.
Я нашел это настолько странным и fyi, это очень простой код. Это не похоже на то, что он работает в многопоточной среде.
Моя конфигурация 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
Ответы
Ответ 1
Это проблема разрешения. По крайней мере, то, что происходит со мной.
Я новичок в использовании Log4Net, поэтому я не знал, что у него есть внутреннее ведение журнала, но я нашел его, поэтому я попытался превратить внутреннее ведение журнала on.
Я был не очень уверен, что это говорит, но вот, как мне это выглядит:
1. Добавьте дату к имени файла.
2. Попробуйте получить доступ к файлу для записи на него (не удалось).
3. Добавьте дату к имени файла еще раз.
4. Успешно получить доступ к файлу (который теперь имеет странное имя файла)
Прежде чем я это узнаю, я искал решение этой проблемы с такими ключевыми словами, как то, что у меня есть как заголовок в этом вопросе stackoverflow. Там было не так много информации. Я нашел, может быть, одного парня, который сказал, что это случается с некоторыми людьми, но никогда не объясняло почему и решение. С этой новой информацией (+ внутреннее сообщение об ошибке из Log4Net) я искал разные потоки из поисковых систем. С этим я нашел подсказки, что это может быть проблема разрешения.
Кажется, что приложение для записи не имеет достаточного разрешения для папки журналов. Идентификатор приложения по умолчанию обычно является NETWORK_SERVICE. После того, как я дам больше прав (я дал ему полный контроль, но я не знаю, что является минимальным, чтобы заставить его работать) в папку, все работает отлично.
Если кто-нибудь может объяснить это лучше меня, не стесняйтесь редактировать.
Ответ 2
Это происходит, если есть проблема с доступом к файлу журнала при инициализации системы журналов.
Это может произойти, если вы дважды инициализируете систему журналов, если вы запускаете свою программу, когда выполняется другая копия, и записываете в файл журнала, или если вы редактируете файл журнала в текстовом редакторе. В основном все, что вызывает блокировку записи в файле журнала при запуске log4net init.
Проверьте код для повторных вызовов в log4net init - возможно, вы инициализируетесь в конструкторе, а не в статическом конструкторе singleton или глобальном init, например.
Это также может произойти, если вы работаете в конфигурации "веб-сад" и не включаете PID в имя файла, потому что каждый процесс веб-сервера пытается записать в тот же файл. Если вы используете веб-сады и записываете файлы, добавьте pid в шаблон имени файла, чтобы каждый серверный процесс получил свой собственный файл.
Ответ 3
Как отметил ол. ваша проблема связана с '\ g', которую ваш log4net интерпретирует как другой формат даты.
Попробуйте удалить ".yyyy-MM-dd.lo\g" и заменить его "yyyy-MM-dd"
".log" не входит в формат даты
Ответ 4
Я использую следующее:
<param name="DatePattern" value="yyyy.MM.dd.\l\o\g"/>
С этим я получаю имена файлов: 2009.02.23.log
Ответ 5
Я сталкиваюсь с той же проблемой. Для меня это была комбинация использования 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'.
Надеюсь, что это поможет.
Ответ 6
try <datePattern value=".yyyy-MM-dd.lo\g" />
Я не понимаю, что означает\g.