gpt4 book ai didi

c# - 作为网络服务运行时,log4net 静默失败

转载 作者:太空宇宙 更新时间:2023-11-03 23:22:06 26 4
gpt4 key购买 nike

我有一个启动控制台应用程序的 Web 服务。控制台应用程序包含 Log4net。

来自控制台应用程序的代码:

log4net.Config.XmlConfigurator.Configure();
ILog log = log4net.LogManager.GetLogger(typeof(Program));

我遇到的问题是,当它作为网络服务 运行时,不会创建 log4net 日志文件。应用程序不会失败它只是继续而不记录。

我需要找到一种方法来检测这一点并使应用程序失败,如果没有日志文件我们就无法继续。我需要通知用户他们需要修复权限,以便网络服务可以创建文件。

如何检测到创建文件失败?我能够想出的唯一解决方案是检查该文件是否存在于应用程序的顶部,以及它是否不是为了停止而创建的。这对我来说就像是一个 hack,Log4net 应该能够告诉我它无法创建文件。

更新:

我正在测试以下内容。我目前的测试方法是在第一次创建文件后将文件设置为只读,然后就没有权限写入它。此时它应该会失败,因为它无法写入日志文件。

string logFile = @"D:\TaskDev\Log4NetTesting\Log4NetTesting\bin\Debug\Test\Log4netTesting.Log";
log4net.GlobalContext.Properties["LogFileName"] = logFile;
log4net.Config.XmlConfigurator.Configure();
log4net.NDC.Push("Test Application");
ILog log = log4net.LogManager.GetLogger(typeof(Program));

var m = LogManager.GetAllRepositories().SelectMany(repository => repository.GetAppenders()).OfType<FileAppender>();

try
{
log.Info("hello Log test");
}
catch (Exception ex) {
Console.WriteLine("Log write failed: " + ex.Message);
}
Console.WriteLine("Done");
Console.ReadLine();

应用程序配置

 <configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="EventLogAppender" type="log4net.Appender.EventLogAppender">
<errorHandler type="Log4NetTesting.util.CustomLogErrorHandler" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline"/>
</layout>
</appender>
<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%property{LogFileName}" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="250KB" />
<staticLogFileName value="true" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</appender>

最佳答案

您是否考虑过为您的 FileAppender 设置 ErrorHandler?

您可以使用以下代码获取配置文件中设置的 FileAppender:

var fileAppenders = LogManager.GetAllRepositories().SelectMany(repository => repository.GetAppenders()).OfType<FileAppender>();
foreach (var fileAppender in fileAppenders) {
fileAppender.ErrorHandler = new MyErrorHandler();
}

MyErrorHandler 类有点像这样:

class MyErrorHandler : IErrorHandler {
public void Error(string messages) {
// giver error message and abort
}
public void Error(string messages, Exception exception) {
// giver error message and abort
}
public void Error(string messages, Exception exception, ErrorCode errorCode) {
// giver error message and abort
}
}

我不确定“提供错误消息并中止”有多简单,因为您在服务中没有 GUI 访问权限

此处列出了 FileAppender 成员:http://logging.apache.org/log4net/release/sdk/html/AllMembers_T_log4net_Appender_FileAppender.htmIErrorHandler 成员在这里: http://logging.apache.org/log4net/release/sdk/html/AllMembers_T_log4net_Core_IErrorHandler.htm

您可能还想在 repository.ConfigurationChanged 注册一个事件

关于c# - 作为网络服务运行时,log4net 静默失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35056277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com