我在 1 个项目中有一个控制台应用程序,在另一个项目中有一个 Windows 服务应用程序。两个应用程序都创建同一类的实例,并且在该类中我实例化了我构建的自定义“Logger”类,该类调用 Log4Net 的使用。
两个应用程序创建实例的类都有一个构造函数,如下所示,
public MyClass()
{
// Some stuff
Logger = new Logger();
Logger.WriteInfo("Receive() - Client and Processor have now been created");
}
现在 Logger 类看起来像这样,
using System;
using log4net.Config;
using log4net;
using System.Reflection;
using log4net.Repository;
using log4net.Util;
namespace App.WindowsService
{
public class Logger
{
private static readonly ILog log = LogManager.GetLogger(typeof(Logger));
public Logger()
{
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()!);
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
}
public void WriteDebug(string Message)
{
log.Debug(Message);
}
public void WriteInfo(string Message)
{
log.Info(Message);
}
public void WriteWarning(string Message)
{
log.Warn(Message);
}
public void WriteError(string Message)
{
log.Error(Message);
}
public void WriteFatal(string Message)
{
log.Fatal(Message);
}
}
}
运行控制台应用程序时,会在控制台应用程序运行的同一目录中成功创建日志文件。但是,当我在调试模式下运行服务应用程序并作为实际服务运行时,不会创建日志文件。我尝试将以下几行添加到我的 Logger 构造函数中,
string? workingDirectory = Environment.CurrentDirectory;
LogManager.GetRepository().Name = $"{workingDirectory}\\Temp";
logRepository.Properties["LogFileLocation"] = $"{workingDirectory}";
logRepository.Properties["LogFileName"] = $"mylogfile";
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
将以下内容添加到 log4net.config 文件中,该文件输出到与应用程序 exe 文件相同的目录,
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file value="%property{LogFileLocation}\\%property{LogFileName}.log" />
不幸的是,这没有任何区别。我怀疑这可能需要与我的服务应用程序项目中的 Program.cs 文件有关,该文件目前看起来像这样,
using App.WindowsService;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;
using Microsoft.Extensions.Options;
using static App.WindowsService.WindowsBackgroundService;
var builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options =>
{
options.ServiceName = ".NET My Service";
});
LoggerProviderOptions.RegisterProviderOptions<
EventLogSettings, EventLogLoggerProvider>(builder.Services);
builder.Services.Configure<ConnectionConfiguration>(config =>builder.Configuration.GetSection(ConnectionConfiguration.Configuration!).Bind(config));
builder.Services.AddSingleton<MyClass>();
builder.Services.AddHostedService<WindowsBackgroundService>();
var host = builder.Build();
host.Run();
是否有人能够阐明我需要在这里做什么,以便我的服务应用程序能够额外使用 Log4Net 将事件记录到适用于我的控制台应用程序的文件中?
更新: 这似乎不是权限问题。问题似乎是激活 Log4net 的配置。您可以看到下面有 2 个正在运行的 Logger 类实例,一个来自控制台应用程序,另一个来自服务应用程序。
1) 您可以看到 logRepository.Configured 在这里为 true,并且在本例中创建了日志文件。
2) 您可以看到 logRepository.Configured 在这里为 false,在这种情况下,不会创建日志文件。
从here阅读此来源后,我能够开始日志记录工作!结果服务项目需要看到一个“App.config”文件,如果项目中还没有该文件,您可能需要手动添加该文件,然后添加以下内容,
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="log4net.Internal.Debug" value="true"/>
</appSettings>
</configuration>
完成此操作后,我仍然遇到一个问题,因为我的 Logger 类试图从服务应用程序文件夹中查找 log4net.config 文件,但实际上它位于 bin 目录中,这是应用程序运行的位置我必须对我的 Logger 构造函数进行一些轻微的调整,如下所示,
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly()!);
string? path = Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location);
XmlConfigurator.Configure(logRepository, new FileInfo($"{path}\\log4net.config"));
现在问题已经解决了!