首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >强制Log4Net输出特定事件

强制Log4Net输出特定事件
EN

Stack Overflow用户
提问于 2022-03-14 15:25:49
回答 2查看 130关注 0票数 2

我在我的应用程序中使用log4net进行诊断日志记录,也就是说,如果log4net不能工作,那么应用程序无论如何都能正常运行。我有一个单独的审计跟踪日志,如果审计跟踪失败,它将阻止应用程序。

我希望在我的log4net日志中包含审计跟踪消息,但我有一个难题:我希望以最高优先级(关键类似)输出AuditTrail消息,但我不希望审计跟踪消息被表示为致命错误。

它们应该以信息级别发出,因为它们不是关键错误,而只是强制性消息。

我正在研究log4net的内部结构,无意中发现了受保护的Logger.Forcedlog方法:

代码语言:javascript
复制
/// <summary>
/// Creates a new logging event and logs the event without further checks.
/// </summary>
/// <param name="logEvent">The event being logged.</param>
/// <remarks>
/// <para>
/// Delivers the logging event to the attached appenders.
/// </para>
/// </remarks>
protected virtual void ForcedLog(LoggingEvent logEvent)
{
  logEvent.EnsureRepository((ILoggerRepository) this.Hierarchy);
  this.CallAppenders(logEvent);
}

我可以通过反射和绕过任何水平检查来调用这个方法,但是我感到非常内疚。

有没有“更清洁”的替代方案?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-16 21:25:54

您可以在AuditLog设置中设置有或没有显式配置的命名记录器,例如log4net

默认情况下,此记录器将从根记录器或配置日志记录器继承日志级别。

在应用log4net配置之后,使用所需的(最小)日志级别配置/取消特定的记录器。

您可以应用配置,例如从文件中。

代码语言:javascript
复制
var repository = log4net.LogManager.GetRepository(Assembly.GetExecutingAssembly());
log4net.Config.XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));

在上述配置之后,您将以编程方式更改AuditLog记录器的日志级别,例如,将其更改为Info

代码语言:javascript
复制
var auditLog = repository.GetLogger("AuditLog") as Logger;
auditLog.Level = log4net.Core.Level.Info;

在应用程序中的任何地方,当您通过此AuditLog记录器登录时,都会考虑以编程方式设置它的级别。下面记录信息性消息的调用将在满足已设置的Info日志级别时传递。

代码语言:javascript
复制
var auditLog = LogManager.GetLogger("AuditLog");
auditLog.Info("Hello audit trail log!");

举个例子。

给定下面的配置(日志级别为Off ),AuditLog记录器仍将记录到已配置的FileAppender

由于Off设置,任何其他记录器都不会。

代码语言:javascript
复制
<log4net>
    <appender name="FileAppender" type="log4net.Appender.FileAppender">
        <file value="log-file.txt" />
        <appendToFile value="true" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%date [%thread] %-5level %logger %message%newline" />
        </layout>
    </appender>
    <root>
        <level value="Off" />
        <appender-ref ref="FileAppender" />
    </root>
</log4net>
票数 2
EN

Stack Overflow用户

发布于 2022-03-18 17:25:34

感谢@pfx的想法,最终为我工作的实际上是声明一个自定义日志级别。

考虑到这不是我所要求的,我是在奖励pfx的答案,但我在这里报告我的解决方案,以防它能帮助到其他人:

代码语言:javascript
复制
// declares a custom Log4Net Level named Audit with the same priority of Fatal errors
private static readonly Level AuditTrailLevel = new Level(Level.Fatal.Value, "AUDIT");

// to be used as:
_log.Logger.Log(null, AuditTrailLevel, message, exception);

又甜又简单!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71470231

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档