【问题标题】:Logging multiple instance application best practice?记录多实例应用程序最佳实践?
【发布时间】:2011-04-20 09:32:37
【问题描述】:

我终于为我的 WPF 桌面应用程序尝试了 log4net。

RollingFileAppender 没有内置对多实例应用程序的支持,这让我很苦恼。

我不喜欢仅仅为了让记录器满意而将应用程序限制为单个实例的想法。单实例技巧都是丑陋的技巧。

在日志文件的文件名中使用进程 ID 也不够好。这可能会占用无限空间,因为 RollingFileAppender 在这种情况下是无用的。

一种解决方案可能是将日志发送到不同的进程,该进程负责将输出序列化为文件。但这会带来新的麻烦。

您对此有何看法?

【问题讨论】:

  • 您可以将日志发送到 Web 服务并集中存储吗?这样您就可以快速响应用户遇到的问题。
  • @Steven:增加了网络连接的要求。并不总是很有趣。
  • @Martinho:您可以构建这样的机制,即当网络不可用时在本地记录信息,并在网络再次可用时重新发送。当然需要自己写。

标签: c# .net log4net multiple-instances


【解决方案1】:

使用来自不同进程的多个 RollingFileAppender 实例不是一个好主意the RollingFileAppender isn't designed for that scenario 以来写入同一个文件。

你有几个选择:

具有最小锁定的多个 FileAppender

使用多个FileAppender 实例指向同一个文件并配置最小锁定。这将允许来自多个进程的并发写入操作:

<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="Log.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern
            value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
</appender>

多个 EventLogAppender

使用多个写入共享 Windows 事件源的 EventLogAppender 实例:

<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" >
    <applicationName value="MyApp" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern
            value="%date [%thread] %-5level %logger - %message%newline" />
    </layout>
</appender>

当然,您也可以发送日志to a databaseto a remote component 在不同的进程甚至不同的机器上运行,但这些选择需要设置更多的基础架构,因此对于您的场景来说可能是多余的。

相关资源:

【讨论】:

  • 感谢您指出 FileAppender。我以为它被滚动表弟取代了。
【解决方案2】:

当您想要记录到滚动文件并避免写入同一日志文件的风险时,另一个选项是programmatically change the name of the log4net log file 路径。例如,您可以将日志文件名或其一部分作为进程启动参数传递,然后从代码中进行设置。

只需确保在发生任何日志记录之前更改路径即可。否则,可以使用与上一个答案中的“具有最小锁定的多个 FileAppender”类似的配置。

【讨论】:

    【解决方案3】:

    通过在日志文件路径中添加任何环境变量来解决此问题的最简单方法。例如:在我的情况下,我们需要每个 Windows 用户配置文件的应用程序实例。因此,我们在 "RollingFileAppender" 的日志文件路径中包含 "USERNAME" 环境变量,如下所示:

     <file value="Logs/${USERNAME}/Log.txt"/>
    

    【讨论】:

    • 如果同一个用户多次启动应用,我认为这并不能解决问题。
    猜你喜欢
    • 2013-01-24
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多