【问题标题】:log4net not working when running WPF application's executable运行 WPF 应用程序的可执行文件时 log4net 不起作用
【发布时间】:2016-07-27 14:59:43
【问题描述】:

我在 WPF 应用程序中使用 log4net。 log4net 在从 Visual Studio 运行应用程序时工作,但是,当我们通过来自 bin 的可执行文件运行应用程序时,它不工作。

我们正在使用log4net.config 文件,它的外观如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net debug="true">
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="C:/ProgramData/CompApps/Logs/AppName/log.txt" />
      <appendToFile value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="25" />
      <maximumFileSize value="20MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%utcdate UTC %property{log4net:HostName} [%thread] %-5level %logger - %method() - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="Info" />
      <appender-ref ref="RollingFileAppender" />
    </root>
  </log4net>
</configuration>

log4net.config 属性

Build Action: Content
Copy to Output Directory: Copy always

AssemblyInfo.cs:

// log4net config
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]

这在我们要使用记录器的每个类中使用:

private static readonly ILog log = LogManager.GetLogger(typeof(App));

【问题讨论】:

  • 运行应用程序的用户是否对C:/ProgramData/CompApps/Logs/AppName/有写权限?
  • 是的,运行应用程序的用户对C:/ProgramData/CompApps/Logs/AppName/有写权限
  • debug="true" 从 .exe 执行时不记录是否有意义?
  • 我删除了 debug="true" 标志 - 结果相同。
  • 如果您直接从bin 文件夹运行它,log4net.config 文件是否也位于.exe 旁边?您如何测试.exe 的执行上下文可以访问logs 文件夹?

标签: c# .net wpf log4net log4net-configuration


【解决方案1】:

另一种在代码中配置的方法:

namespace Company.Product
{
    using System.Text;
    using log4net;
    using log4net.Appender;
    using log4net.Core;
    using log4net.Layout;
    using log4net.Repository.Hierarchy;

    public static class LogHelper
    {
        static LogHelper()
        {
            var hierarchy = (Hierarchy)LogManager.GetRepository();
            hierarchy.Root.Level = Level.All;
            hierarchy.Configured = true;
        }

        public static ILog GetLoggerRollingFileAppender(string logName, string fileName)
        {
            var log = LogManager.Exists(logName);

            if (log != null) return log;

            var appenderName = $"{logName}Appender";
            log = LogManager.GetLogger(logName);
            ((Logger)log.Logger).AddAppender(GetRollingFileAppender(appenderName, fileName));

            return log;
        }

        public static RollingFileAppender GetRollingFileAppender(string appenderName, string fileName)
        {
            var layout = new PatternLayout { ConversionPattern = "%date{dd.MM.yyyy HH:mm:ss.fff}  [%-5level]  %message%newline" };
            layout.ActivateOptions();

            var appender = new RollingFileAppender
            {
                Name = appenderName,
                File = fileName,
                AppendToFile = true,
                RollingStyle = RollingFileAppender.RollingMode.Size,
                MaxSizeRollBackups = 2,
                MaximumFileSize = "500KB",
                Layout = layout,
                ImmediateFlush = true,
                LockingModel = new FileAppender.MinimalLock(),
                Encoding = Encoding.UTF8,
            };

            appender.ActivateOptions();

            return appender;
        }
    }
}

用于您的案例:

private static readonly ILog log = LogHelper.GetLoggerRollingFileAppender(typeof(App), "C:/ProgramData/CompApps/Logs/AppName/log.txt");

或从您的应用程序配置文件中引用日志文件完整路径。

【讨论】:

  • 这成功了!少一个需要担心的配置文件。好东西!
  • 如果我想使用github.com/cjbhaines/Log4Net.Async#forwarding-appenders,此配置将如何更改?
  • 无法测试,因为我目前来自移动设备,但您尝试过并收到任何错误吗?您可能需要在配置中从这个自定义库创建滚动文件附加程序,而不是从旧的 log4net 库。我以前从未使用过这个 nuget 包,所以如果事情不起作用,你最好创建新问题。
  • 知道了。谢谢山姆!
猜你喜欢
  • 2018-05-21
  • 2019-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多