.Net Core Worker 服务在作为 windows 服务运行时找不到 log4net.config

.Net Core Worker Service cannot find log4net.config when it runs as a windows service

我的解决方案中有这些项目:

  1. .Net Core 3.1 工人服务
  2. .Net Core 3.1 Class 库 - 用于配置 log4net

但是我的 log4net.config 文件在我的工作人员服务项目中。当我调试时,它正在记录到在 log4net.config.

中配置的文件

但是当我将 Worker Service 安装为 Windows 服务时,它不会记录到文件中。

当我检查 log4net.config 位置时,它具有以下值:

  1. 调试时:D:\myrepos\webapicore\Development\Message.Consumer\log4net.config
  2. 当 运行 作为服务时:C:\WINDOWS\system32\log4net.config

所以我相信,由于 log4net.configC:\WINDOWS\system32\ 中不可用,因此无法进行日志记录。

更新: 我正在使用以下代码检索 log4net.config

var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

有什么解决办法吗?

谢谢。

我已经在另一个 class 库中安装和配置了 log4net。 所以当我得到 Assembly.GetEntryAssembly() 它实际上没有给出 log4net 安装位置的程序集位置。

因此我更改了这段代码部分:

var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));

进入:

var dirname = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
XmlConfigurator.Configure(new FileInfo(string.Format("{0}{1}", dirname, @"\log4net.config")));

这对我有用。

这也适用于我的 .NET 5 WorkerService

您也可以使用 AppDomain.CurrentDomain.BaseDirectory

然而,我随后发现您可以简单地创建一个 AssemblyInfo.cs 文件(添加新项目...)并添加

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

就像以前使用 .NET Framework 4.5 等一样