我终于为我的WPF桌面应用程序尝试了log4net。
我正在努力解决RollingFileAppender没有内置支持多实例应用程序的事实。
我不喜欢将应用程序限制为单个实例只是为了让logger满意。单一的伎俩技巧都是丑陋的黑客。
在日志文件的文件名中使用进程ID也不够好。这有可能占用无限空间,因为在这种情况下RollingFileAppender毫无用处。
一种解决方案可能是将日志发送到不同的进程,这会将输出序列化为文件。但这会带来新的麻烦。
你对此有何看法?
答案 0 :(得分:17)
使用来自不同进程的多个RollingFileAppender实例 不是一个好主意从the RollingFileAppender isn't designed for that scenario开始写入同一文件。
您有几个选择:
使用指向同一文件并使用最小锁定配置的多个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>
使用写入共享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 database或to 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"/>