C# 运行WPF应用程序时log4net不工作';可执行文件
我正在WPF应用程序中使用log4net。log4net在从visualstudio运行应用程序时工作,但是,当我们从C# 运行WPF应用程序时log4net不工作';可执行文件,c#,.net,wpf,log4net,log4net-configuration,C#,.net,Wpf,Log4net,Log4net Configuration,我正在WPF应用程序中使用log4net。log4net在从visualstudio运行应用程序时工作,但是,当我们从bin通过可执行文件运行应用程序时,它不工作 我们正在使用一个log4net.config文件,下面是它的样子: <?xml version="1.0" encoding="utf-8" ?> <configuration> <log4net debug="true"> <appender name="RollingFileA
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>
AssemblyInfo.cs
:
// log4net config
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
这在我们想要使用记录器的每个类中都使用:
private static readonly ILog log = LogManager.GetLogger(typeof(App));
代码配置的另一种方法:
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");
或引用应用程序配置文件中的日志文件完整路径。运行应用程序的用户是否具有对
C:/ProgramData/CompApps/Logs/AppName/
的写入权限?是的,运行应用程序的用户具有对C:/ProgramData/CompApps/Logs/AppName/
的写入权限从.exe执行时不记录是否有意义?我删除了debug=“true”
标志-结果相同。如果您从bin
文件夹运行它,log4net.config
文件是否也位于.exe
旁边?您是如何测试.exe
的执行上下文是否可以访问日志
文件夹的?这很有效!少了一个需要担心的配置文件。好东西!如果我想使用,这个配置会发生什么变化?无法测试它,因为我目前来自移动设备,但您尝试过并得到任何错误吗?您可能需要在配置中从这个自定义库而不是从遗留的log4net库创建滚动文件追加器。我以前从未使用过这个nuget包,所以如果事情不顺利,你最好创建一个新问题。明白了。谢谢你,山姆!
private static readonly ILog log = LogHelper.GetLoggerRollingFileAppender(typeof(App), "C:/ProgramData/CompApps/Logs/AppName/log.txt");