我正在将 .NET Core 3.1 应用程序作为 Windows 服务运行,并在其中添加了 log4net 日志记录。我遇到的问题是它记录到“C:/Windows/System32/Logs”文件夹,而不是 .exe 文件所在的目录。据我所知,Windows 服务的执行路径不同,导致日志保存在不同的位置。但是,是否有一种方法可以修改该文件夹,使其记录到与 .exe 文件相同的目录?对于解决方案中的所有其他 Web 应用程序,它会记录到同一已发布文件夹。
这是 log4net 配置文件:
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file value="Logs/Logs.txt" />
<encoding value="utf-8" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="50MB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%-5level %date [%-5.5thread] %-40.40logger - %message%newline" />
</layout>
</appender>
<root>
<appender-ref ref="RollingFileAppender" />
<level value="INFO" />
</root>
</log4net>
这是startup.cs文件中的配置:
var configFilepath = Path.Combine(_env.ContentRootPath, "log4net.config");
return services.AddAbp<EMMSubscriberModule>(
options => options.IocManager.IocContainer.AddFacility<LoggingFacility>(
f => f.UseAbpLog4Net().WithConfig(configFilepath)
)
);
我知道你用的是ABP,但是方法应该是一样的,我们需要使用AppDomain.CurrentDomain.BaseDirectory来设置运行的工作路径,这样log4net日志位置才有效。
public class Program
{
public static void Main(string[] args)
{
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
string logDir = Path.Combine(baseDir, "Logs");
string logPath = Path.Combine(logDir, "Logs.txt");
if (!Directory.Exists(logDir))
{
Directory.CreateDirectory(logDir);
}
Environment.SetEnvironmentVariable("logPath", logPath);
WebApplicationOptions options = new()
{
ContentRootPath = baseDir,
Args = args,
WebRootPath = Path.Combine(baseDir, "wwwroot")
};
var builder = WebApplication.CreateBuilder(options);
...
app.Run();
}
}