Log4Net не работает в приложении-службе WindowsC#

Место общения программистов C#
Ответить
Anonymous
 Log4Net не работает в приложении-службе Windows

Сообщение Anonymous »

У меня есть консольное приложение в одном проекте и приложение службы 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-файл приложения, К сожалению, это не имеет никакого значения. Я подозреваю, что для этого может потребоваться что-то связанное с файлом 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(config =>builder.Configuration.GetSection(ConnectionConfiguration.Configuration!).Bind(config));
builder.Services.AddSingleton();
builder.Services.AddHostedService();

var host = builder.Build();
host.Run();
Сможет ли кто-нибудь пролить свет на то, что мне нужно здесь сделать, чтобы мое приложение-служба могло дополнительно использовать Log4Net для регистрации событий в файл, какой вариант подходит для моего консольного приложения?

Подробнее здесь: https://stackoverflow.com/questions/790 ... pplication
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»