【问题标题】:Why is the date appended twice on filenames when using Log4Net?为什么使用 Log4Net 时文件名上会附加两次日期?
【发布时间】:2013-10-15 20:53:56
【问题描述】:

我试图将日期添加到我的日志文件名中,并且通过遵循我在 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 框架 2.0
- windows server 2003 64 位服务包 2
- log4net 1.2.10

【问题讨论】:

    标签: log4net rollingfileappender


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      【讨论】:

      • 完全控制允许用户更改文件的权限集、获取文件的所有权并执行所有其他文件权限允许的操作。
      【解决方案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 用于“类型”。

      希望对您有所帮助。

      【讨论】:

        【解决方案4】:

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

        “.log”不属于日期格式

        【讨论】:

        • 如果我不放“.log”,我会得到这样的文件名:“log.2009-02-23”,没有扩展名,或者你可以说,日期是扩展名。我想从浏览器访问日志文件夹,所以我需要将“.log”添加到 IIS 中文件夹的 MIME 类型列表中。
        • 你试过不带“.lo\g”,只用“.log”看看“\”是否有问题?
        • 还有,“.”一开始。
        • 我试过“.”,没有任何改变。我尝试从“\g”中删除“\”,就像我说的那样,它将被解释为其他内容。我得到“log.2009-02-24.loA.D..2009-02-24.loA.D”作为文件名。看到“g”现在是“A.D.”
        • 好吧,我想该轮到我道歉了,承认不,我没有答案。对不起 =(
        【解决方案5】:

        我使用以下:

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

        这样我得到的文件名如下:2009.02.23.log

        【讨论】:

        • 你实际上不需要转义 l 和 o 但我认为它不能解决我的问题。
        【解决方案6】:

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

        【讨论】:

        • datePattern 标签接受日期和时间格式的字符串作为值。 “g”是一个有效的日期和时间格式模式(google DateTimeFormatInfo),所以我必须“转义”它,这样它就不会被解释。
        • 你能告诉我更多关于你正在使用的 log4net 版本和你的其他环境(操作系统、.net 版本等)的信息吗?我从来没有遇到过必须从日志中逃脱 g 的问题。
        • - Windows Server 2003 x64 Service Pack 2 - .NET Framework 2.0 - log4net 1.2.10 关于必须转义 g,看看我对 devinb 的评论。
        • datePattern 值是通过.Net 的DateTime.ToString() 方法处理的。它不经过Log4Net的处理。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-09-28
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多