2009-02-23 87 views
20

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

例如,而不是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框架2.0
- 在Windows Server 2003 64位Service Pack 2的
- log4net 1.2.10

回答

5

这是一个权限问题。至少这就是发生在我身上的事情。

我是新使用Log4Net,所以我不知道它有内部日志记录,但我发现它,所以我试着打开internal logging。 我不是很确定它说的是什么,但它看起来像是在做什么: 1.追加日期到文件名。 2.尝试访问要写入的文件(失败)。 3.将日期追加到文件名再次。 4.成功访问文件(其中有奇怪的文件名现在)

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

看来写入应用程序没有足够的权限到日志文件夹。应用程序的默认身份通常是NETWORK_SERVICE。在给予文件夹更多权限(我完全控制它,但我不知道最小化它是如何工作的)后,它工作得很好。

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

0

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

+1

datePattern标签接受日期和时间格式化的字符串作为值。 “g”是一个有效的日期和时间格式模式(谷歌DateTimeFormatInfo),所以我必须“逃避”它,所以它不会被解释。 – 2009-02-23 23:41:49

+0

你能告诉我更多关于你正在使用的log4net的版本和你环境的其他部分(os,.net版本等)。我从来没有遇到过不得不从日志中逃脱的问题。 – olle 2009-02-24 00:48:33

+0

- Windows Server 2003 x64 Service Pack 2 - .NET Framework 2.0 - log4net 1.2.10 关于必须转义g,请查看我对devinb的评论。 – 2009-02-24 18:26:14

1

正如olle指出的那样。你的问题与'\ g'有关,你的log4net将它解释为另一个dateformat。 尝试删除 “.yyyy-MM-dd.lo \ G”,并以 “YYYY-MM-DD”

的 “.LOG” 中的日期格式不属于

1

我用它替换以下:

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

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

10

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

检查你的代码重复调用log4net初始化 - 也许你是在一个构造函数初始化,而不是在单例的静态构造函数或全局初始化,例如。

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

1

我遇到了同样的问题。对我而言,它是将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为'类型'。

希望有所帮助。

相关问题