我终于为我的 WPF 桌面应用程序尝试了 log4net。
我正在为 RollingFileAppender 没有对多实例应用程序的内置支持而苦苦挣扎。
我不喜欢将应用程序限制为单个实例只是为了让记录器开心的想法。单实例技巧都是丑陋的黑客。
在日志文件的文件名中使用进程 ID 也不够好。这有可能会占用无限的空间,因为 RollingFileAppender 在这种情况下是无用的。
一种解决方案可能是将日志发送到不同的进程,该进程负责将输出序列化为文件。但这会带来新的麻烦。
你对此有何看法?
我终于为我的 WPF 桌面应用程序尝试了 log4net。
我正在为 RollingFileAppender 没有对多实例应用程序的内置支持而苦苦挣扎。
我不喜欢将应用程序限制为单个实例只是为了让记录器开心的想法。单实例技巧都是丑陋的黑客。
在日志文件的文件名中使用进程 ID 也不够好。这有可能会占用无限的空间,因为 RollingFileAppender 在这种情况下是无用的。
一种解决方案可能是将日志发送到不同的进程,该进程负责将输出序列化为文件。但这会带来新的麻烦。
你对此有何看法?
使用来自不同进程的多个 RollingFileAppender 实例写入同一个文件并不是一个好主意,因为RollingFileAppender 不是为该场景设计的。
您在这里有几个选择:
使用多个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>
当然,您也可以将日志发送到数据库或在不同进程甚至不同机器中运行的远程组件,但这些选择需要设置更多的基础设施,因此对于您的场景来说可能是多余的。
相关资源:
当您想要记录到滚动文件并避免写入同一日志文件的风险时,另一个选择是以编程方式更改 log4net 日志文件路径的名称。例如,您可以将日志文件名或其一部分作为进程启动参数传递,然后从代码中进行设置。
只需确保在发生任何日志记录之前更改路径即可。否则,可以使用与上一个答案中的“具有最小锁定的多个 FileAppender”类似的配置。
通过在日志文件的路径中添加任何环境变量来解决它的最简单选项。例如:在我的情况下,我们需要每个 Windows 用户配置文件的应用程序实例。因此,我们在“RollingFileAppender”的日志文件路径中包含“USERNAME”环境变量,如下所示:
<file value="Logs/${USERNAME}/Log.txt"/>