当使用Log4Net时,为什么日期在文件名上会出现两次?

23
我试图将日期添加到我的日志文件名中。在stackoverflow上,我找到了一些建议,成功地实现了这个目标。一切都很好,但由于某种原因,第一个文件始终会重复附加日期。
例如,我得到的是log.2009-02-23.log.2009-02-23.log,而不是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位 service pack 2
- log4net 1.2.10

6个回答

11

如果在初始化日志系统时无法访问日志文件,就会发生这种情况。可能是由于多次初始化日志系统、在另一个正在运行并写入日志文件的副本上运行程序或在文本编辑器中编辑日志文件等原因导致对日志文件进行写锁定。

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

如果处于“Web Garden”配置并且没有在文件名中包含PID,则也可能发生这种情况,因为每个不同的Web服务器进程都尝试写入同一文件。如果使用Web Gardens并且要写入文件,请将pid添加到文件名模式中,以便每个服务器进程都获得自己的文件。


8
这是一个权限问题,至少这就是我的情况。我刚开始使用Log4Net,所以不知道它有内部日志记录功能,但我找到了它,并尝试打开内部日志记录。我不太确定它在说什么,但我认为它做了以下几件事情: 1. 将日期附加到文件名。 2. 尝试访问该文件并写入内容(失败)。 3. 再次将日期附加到文件名 。 4. 成功访问该文件(现在具有奇怪的文件名)。
在知道这一点之前,我通过搜索与此堆栈溢出问题标题相同的关键字来寻找解决方案。但是并没有太多信息。我只找到了一个人说这种情况发生在某些人身上,但从未解释过原因或解决方法。有了这个新信息(以及来自Log4Net的内部错误消息),我查看了来自搜索引擎的不同线程。通过这样,我发现这可能是一个权限问题。
似乎写入应用程序没有足够的权限访问日志文件夹。应用程序的默认标识通常为NETWORK_SERVICE。在我赋予文件夹更多权限(我将其授权完全控制,但不知道最小值),之后,它就正常工作了。
如果有人能比我更好地解释这个问题,请随意编辑。

完全控制允许用户更改文件的权限集,获取文件所有权以及执行其他文件权限允许的操作。 - graffic

4
我遇到了同样的问题。对我来说,这是使用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

请注意在“type”中使用PatternString
希望这能帮到您。

那对我有用。在我的情况下,这不是关于权限的问题。 - Virus721

1
正如olle所指出的那样,你的问题与'\g'有关,这是你的log4net解释为另一种日期格式。尝试删除".yyyy-MM-dd.lo\g"并替换为"yyyy-MM-dd"。
".log"不属于日期格式。

如果我不加上“.log”,那么文件名将会是这样的:“log.2009-02-23”,没有扩展名,或者说日期就是扩展名。我想从浏览器中访问日志文件夹,所以我需要在IIS中将“.log”添加到该文件夹的MIME类型列表中。 - Hertanto Lie
你尝试过不加“\”直接使用“.log”来查看问题是否出在“\”上了吗? - DevinB
此外,开头的“.”。 - DevinB
我尝试使用“。”,但未见改变。 我尝试将"\g"中的“\”移除,就像我说的那样,它将被解释为其他内容。我得到了"log.2009-02-24.loA.D..2009-02-24.loA.D"作为文件名。请注意,“g”现在变成“A.D.”。 - Hertanto Lie
好吧,我想轮到我道歉了,并承认我没有答案。抱歉 =( - DevinB
没问题。谢谢你花时间来检查它 :) 这可能只是在64位系统上出现问题,所以有点奇怪。 - Hertanto Lie

1

我使用以下内容:

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

通过这个,我可以得到像这样的文件名:2009.02.23.log


实际上你不需要转义l和o,但我认为这并不能解决我的问题。 - Hertanto Lie

0
尝试使用<datePattern value=".yyyy-MM-dd.lo\g" />,我不明白\g是用来做什么的。

1
datePattern 标签接受日期和时间格式的字符串作为值。"g" 是一个有效的日期和时间格式模式(参考 Google DateTimeFormatInfo),因此我必须对它进行“转义”,以免被解释。 - Hertanto Lie
你能告诉我你正在使用的log4net版本以及你的环境的其他信息(操作系统,.NET版本等)吗?我从来没有遇到过需要转义log中的g的问题。 - olle
  • Windows Server 2003 x64 Service Pack 2
  • .NET Framework 2.0
  • log4net 1.2.10 关于需要转义g,请看我给devinb的评论。
- Hertanto Lie
datePattern 值通过 .Net 的 DateTime.ToString() 方法进行处理,不会经过 Log4Net 的处理。 - Zarepheth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接