【发布时间】:2019-04-02 03:41:17
【问题描述】:
我有一个启动控制台应用程序的 Web 服务。控制台应用程序包含 Log4net。
来自控制台应用程序的代码:
log4net.Config.XmlConfigurator.Configure();
ILog log = log4net.LogManager.GetLogger(typeof(Program));
我遇到的问题是,当它以network services 运行时,不会创建 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();
app.config
<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>
【问题讨论】:
-
Log4Net 静默失败是其主要功能之一。对于大多数应用程序来说,日志系统应该尽可能地减少它对应用程序的影响,包括在日志系统发生故障时不让它崩溃。当然,这会导致 log4net 故障排除不那么简单。您可以activate log4net internal logging(或here)获取失败原因。
-
对我们(又名我的老板)来说,默默地失败是一件非常糟糕的事情。如果我们没有日志文件,我们不知道有什么问题。
-
静默失败对业务功能来说是一件非常糟糕的事情。如果日志记录对于您的应用程序来说是其业务的一部分,那么您可能应该考虑使用 log4net 以外的其他东西,它主要用于技术日志记录、监督或诊断。此类日志记录必须尽最大努力尽可能减少对业务功能的影响,从而静默失败。请参阅log4net doc,其中明确说明。
-
我们在设计这个应用程序时并没有意识到这个限制。我刚刚发现 log4net 非常易于使用,它可以满足我们的目的,因为这是一个自动运行的服务器应用程序。服务器管理员仍然需要知道是否存在问题,日志记录是实现这一目标的唯一方法。
-
这在我看来是技术日志的使用。在我看来,这样的日志无法损害您的日志应用程序的功能仍然是最佳实践。对于您提到的情况,如果您的应用程序没有超过两个日志之间的某个最大时间间隔,那么您的监督系统可以调整为在根本没有发生日志时发出警报。