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

为什么在使用Log4Net时在文件名上附加两次日期?,log4net,rollingfileappender,Log4net,Rollingfileappender,我试图将日期添加到我的日志文件名中,通过遵循stackoverflow中的一些建议,我能够使它正常工作。一切正常,但由于某些原因,第一个文件总是附加两次日期 例如,我得到的不是log.2009-02-23.log,而是log.2009-02-23.log.2009-02-23.log 我发现它很奇怪,仅供参考,这是一个非常简单的代码。它不像是在多线程环境中运行的 我的log4net配置: 你知道为什么吗 编辑:我想添加有关我正在测试的环境的信息 -asp.net -.net framewor

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

例如,我得到的不是log.2009-02-23.log,而是log.2009-02-23.log.2009-02-23.log

我发现它很奇怪,仅供参考,这是一个非常简单的代码。它不像是在多线程环境中运行的

我的log4net配置:


你知道为什么吗

编辑:我想添加有关我正在测试的环境的信息
-asp.net
-.net framework 2.0
-windows server 2003 64位service pack 2

-log4net 1.2.10

试试
我不明白\g是用来干什么的。

正如奥利指出的那样。您的问题与“\g”有关,您的log4net将其解释为另一种日期格式。 尝试删除“.yyyy-MM-dd.lo\g”并将其替换为“yyy-MM-dd”

“.log”不属于日期格式

我使用以下格式:

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


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

这是一个权限问题。至少我是这样的

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

在我知道这一点之前,我在谷歌上搜索这个问题的解决方案,搜索的关键词就像我在这个问题上的标题一样。没有那么多的信息。我发现可能有一个人说这种事发生在某些人身上,但他从未真正解释过原因或解决方案。有了这些新信息(+来自Log4Net的内部错误消息),我看到了搜索引擎中的不同线程。有了这些,我发现了可能是权限问题的提示

编写应用程序似乎没有足够的权限访问日志文件夹。应用程序的默认标识通常是网络服务。在我给了文件夹更多的权限(我给了它完全的控制权,但我不知道让它工作的最低限度是多少)之后,它就可以正常工作了


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

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

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


如果您在“web garden”配置中运行,并且文件名中不包含PID,则也可能发生这种情况,因为每个不同的web服务器进程都试图写入同一个文件。如果使用web gardens并写入文件,请将pid添加到文件名模式,以便每个服务器进程都有自己的文件。

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

结果表明,ReSharper使用两个进程来运行测试:

这将在日志文件上创建竞争条件

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

“类型”的


希望对您有所帮助。

datePattern标记接受日期和时间格式的字符串作为值。“g”是一个有效的日期和时间格式模式(google DateTimeFormatInfo),所以我必须“转义”它,这样它就不会被解释。你能告诉我更多关于你正在使用的log4net版本和你环境的其他部分(os、.net版本等)的信息吗。我从来没有遇到过必须从日志中转义g的问题。-Windows Server 2003 x64 Service Pack 2-.NET Framework 2.0-log4net 1.2.10关于必须转义g的问题,请查看我对devinb的评论。
datePattern
值是通过.NET的
DateTime.ToString()
方法处理的。它不经过Log4Net的处理。如果我不放“.log”,我会得到这样的文件名:“log.2009-02-23”,没有扩展名,或者你可以说,日期就是扩展名。我想从浏览器访问logs文件夹,因此我需要将“.log”添加到IIS中文件夹的MIME类型列表中。您是否在没有“.lo\g”和“.log”的情况下尝试过它,以查看“\”是否有问题?另外,开始时的“.”。我尝试过“.”,没有任何更改。我尝试从“\g”中删除“\”,正如我所说的,它将被解释为其他内容。我得到了“log.2009-02-24.loA.D..2009-02-24.loA.D”作为文件名。注意“g”现在是“A.D.”好吧,我想轮到我道歉了,并承认不,我没有答案。抱歉=(您实际上不需要转义l和o,但我认为这并不能解决我的问题。完全控制允许用户更改文件的权限集,获得文件的所有权,并执行所有其他文件权限允许的操作。