我试图将日期添加到我的日志文件名中,并且我能够通过遵循我在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
答案 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使用两个进程来运行测试:
在日志文件中创建竞争条件。
现在,如果我们更改日志文件名以包含进程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是什么。