Log4Net 不适用于 Windows 服务应用程序

问题描述 投票:0回答:1

我在 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) Console application - working 您可以看到 logRepository.Configured 在这里为 true,并且在本例中创建了日志文件。

2) Service application - not working 您可以看到 logRepository.Configured 在这里为 false,在这种情况下,不会创建日志文件。

c# .net-core windows-services log4net
1个回答
0
投票

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"));

现在问题已经解决了!

© www.soinside.com 2019 - 2024. All rights reserved.