.Net Core Worker 服务在作为 windows 服务运行时找不到 log4net.config
.Net Core Worker Service cannot find log4net.config when it runs as a windows service
我的解决方案中有这些项目:
- .Net Core 3.1 工人服务
- .Net Core 3.1 Class 库 - 用于配置 log4net
但是我的 log4net.config
文件在我的工作人员服务项目中。当我调试时,它正在记录到在 log4net.config
.
中配置的文件
但是当我将 Worker Service 安装为 Windows 服务时,它不会记录到文件中。
当我检查 log4net.config
位置时,它具有以下值:
- 调试时:
D:\myrepos\webapicore\Development\Message.Consumer\log4net.config
- 当 运行 作为服务时:
C:\WINDOWS\system32\log4net.config
所以我相信,由于 log4net.config
在 C:\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 等一样
我的解决方案中有这些项目:
- .Net Core 3.1 工人服务
- .Net Core 3.1 Class 库 - 用于配置 log4net
但是我的 log4net.config
文件在我的工作人员服务项目中。当我调试时,它正在记录到在 log4net.config
.
但是当我将 Worker Service 安装为 Windows 服务时,它不会记录到文件中。
当我检查 log4net.config
位置时,它具有以下值:
- 调试时:
D:\myrepos\webapicore\Development\Message.Consumer\log4net.config
- 当 运行 作为服务时:
C:\WINDOWS\system32\log4net.config
所以我相信,由于 log4net.config
在 C:\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 等一样