使用Log4Net时,为什么在文件名上附加两次日期?

时间:2009-02-23 22:38:10

标签: log4net rollingfileappender

我试图将日期添加到我的日志文件名中,并且我能够通过遵循我在stackoverflow中找到的一些建议来使其工作。一切正常,但由于某种原因,第一个文件总是有两次附加日期。

例如,我没有 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 个答案:

答案 0 :(得分:11)

如果在初始化日志系统时访问日志文件时出现问题,则会发生这种情况。 如果您初始化日志系统两次,如果在另一个副本运行并运行日志文件时运行程序,或者您正在文本编辑器中编辑日志文件,则会发生这种情况。基本上是当log4net init运行时导致日志文件写入锁定的任何内容。

检查代码是否有对log4net init的重复调用 - 例如,您可能正在构造函数中初始化,而不是在单例的静态构造函数或全局init中初始化。

如果您在“Web园”配置中运行并且未在文件名中包含PID,也会发生这种情况,因为每个不同的Web服务器进程都会尝试写入同一文件。如果使用Web园并写入文件,请将pid添加到文件名模式,以便每个服务器进程都获得自己的文件。

答案 1 :(得分:6)

这是一个许可问题。至少那就是发生在我身上的事情。

我是使用Log4Net的新手,所以我不知道它有内部日志,但我找到了,所以我尝试打开internal logging。 我不太确定它在说什么,但这就是我对它的看法: 1.将日期附加到文件名。 2.尝试访问要写入的文件(失败)。 3.将日期再次附加到文件名 。 4.成功访问该文件(现在具有奇怪的文件名)

在我知道这一点之前,我正在谷歌搜索这个问题的解决方案,关键字就像我在这个stackoverflow问题上的标题。那里没有太多的信息。我发现也许有一个人说这种情况发生在一些人身上,但从未真正解释过为什么也没有解决方案。有了这个新信息(+来自Log4Net的内部错误消息),我正在查看搜索引擎中的不同线程。有了这个,我发现它可能是一个许可问题。

似乎写入应用程序对logs文件夹没有足够的权限。应用程序的默认标识通常是NETWORK_SERVICE。在我给予该文件夹更多的权限(我给它完全控制但我不知道使其工作的最小值是什么)后,它工作得很好。

如果有人能比我更好地解释这一点,请随时编辑。

答案 2 :(得分:3)

我遇到了同样的问题。对我来说,它是我的测试日志使用RollingFileAppender和使用ReSharper运行我的NUnit测试的组合。

事实证明,ReSharper使用两个进程来运行测试:

2 TaskRunners

在日志文件中创建竞争条件。

现在,如果我们更改日志文件名以包含进程ID:

<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'。

希望有所帮助。

答案 3 :(得分:1)

正如奥利指出的那样。你的问题与'\ g'有关,你的log4net正在将其解释为另一个dateformat。 尝试删除“.yyyy-MM-dd.lo \ g”并将其替换为“yyyy-MM-dd”

“。log”不属于dateformat

答案 4 :(得分:1)

我使用以下内容:

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

有了这个我得到的文件名如:2009.02.23.log

答案 5 :(得分:0)

尝试<datePattern value=".yyyy-MM-dd.lo\g" />我不明白\ g是什么。