log4net跨平台XML配置

4
我需要将日志文件存储在Logs子文件夹中。通常,您可以通过修改App.config文件中的FileAppender来实现这一点,具体操作如下:
<file type="log4net.Util.PatternString" value="Logs\MyLog.log" />

然而,这不是跨平台的,因为如果您在Linux上运行它,它将创建一个名为“Logs\MyLog.log”的文件而不是目录。这是因为“\”在Linux上不是路径分隔符。

我们可以将其更改为“/”,但这仅适用于Linux而不适用于Windows。

如何使用log4net的XML配置将我的日志放入可跨平台使用的子文件夹中?

2个回答

2

另一个解决方案是这样使用:

<file type="log4net.Util.PatternString" value=".//Logs//MyLog.log" />


请解释它在Windows和Linux平台上的工作原理? - jjj
它非常好用,我有一个使用相同的配置文件来记录log4net并将日志文件保存在“Logs”目录中的mono项目,没有任何问题。 - Tiago Seminotti
1
我相信这个能够工作是因为Mono有能力在代码中发现目录分隔符时进行转换 - 请参阅IOMap获取更多信息。问题出现在如果你硬编码了 C:\ 部分,可以通过使用相对位置来解决这个问题。 - Jonathan Twite

1

一个可能的解决方案是,你可以将文件配置为Windows格式,然后在配置后测试是否在Linux上运行。当在Linux上运行时,你可以获取appender并使用替换来更改file=>value值以使其与Linux兼容:

XmlConfigurator.Configure();
if (Environment.OSVersion.Platform == PlatformID.Unix){
        var repository = LogManager.GetRepository() as Hierarchy;
        if (repository != null)
        {
            var appenders = repository.GetAppenders();
            if (appenders != null)
            {
                foreach (var appender in appenders)
                {
                    if (appender is FileAppender)
                    {
                        var fileLogAppender = appender as FileAppender;
                        fileLogAppender.File = fileLogAppender.File.Replace (@"\", Path.DirectorySeparatorChar.ToString ());
                        fileLogAppender.ActivateOptions ();
                    }
                }
            }
        }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接