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-bit service pack 2
-log4net 1.2.10

4

6 回答 6

11

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

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

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

于 2009-03-25T04:26:08.690 回答
8

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

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

在我知道这一点之前,我正在用谷歌搜索这个问题的解决方案,比如我在这个 stackoverflow 问题上的标题。那里没有那么多信息。我发现也许有人说它发生在某些人身上,但从未真正解释过原因或解决方案。有了这些新信息(+来自 Log4Net 的内部错误消息),我正在查看来自搜索引擎的不同线程。有了这个,我发现这可能是一个权限问题。

似乎编写应用程序对日志文件夹没有足够的权限。应用程序的默认标识通常是 NETWORK_SERVICE。在我给予文件夹更多权限(我给予它完全控制但我不知道使它工作的最低限度)之后,它工作得很好。

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

于 2009-02-27T01:57:52.243 回答
3

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

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

2 个任务运行者

这会在日志文件上创建一个竞争条件。

现在,如果我们更改日志文件名以包含进程 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用于“类型”。

希望有帮助。

于 2010-10-13T21:35:14.440 回答
1

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

“.log”不属于日期格式

于 2009-02-23T23:07:07.933 回答
1

我使用以下内容:

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

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

于 2009-02-26T09:26:35.840 回答
0

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

于 2009-02-23T22:41:57.463 回答