记录多实例应用程序的最佳实践?

时间:2011-04-20 09:32:38

标签: c# .net log4net multiple-instances

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

我正在努力解决RollingFileAppender没有内置支持多实例应用程序的事实。

我不喜欢将应用程序限制为单个实例只是为了让logger满意。单一的伎俩技巧都是丑陋的黑客。

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

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

你对此有何看法?

3 个答案:

答案 0 :(得分:17)

使用来自不同进程的多个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,但这些选择需要设置更多基础架构,因此对于您的方案可能过度。

相关资源:

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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