【问题标题】:slf4j, logback - refer to appender that is not referenced from any loggerslf4j, logback - 引用没有被任何 logger 引用的 appender
【发布时间】:2013-09-22 14:50:52
【问题描述】:

我想在 logger.xml 文件中定义 SMTPAppender,但我不想从任何记录器中引用它。

然后,当我的应用程序加载时,我希望以编程方式将此附加程序添加到特定的记录器。

但是“getAppender”方法只能从 Logger 访问。

有没有办法解决这个问题并在不通过任何记录器的情况下获取附加程序?

【问题讨论】:

  • 我想如果你不能从上下文中得到它,一个黑客会将它链接到一些从不用户的记录器(比如;this.logger.is.a.dummy.root)然后拉从那里开始?
  • 不幸的是,这是我目前正在使用的解决方案。即使我不控制 logger.xml,我也要求 appender 存在于一个记录器中,以便我可以将其添加到其他记录器。谢谢。

标签: slf4j logback


【解决方案1】:

我想,我不确定我是否理解你的问题,但我可以试一试:

    <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
        <marker>MAIL_LOGS</marker>

    </evaluator>

    <smtpHost>smtp.gmail.com</smtpHost>
    <smtpPort>465</smtpPort>
    <SSL>true</SSL>
    <username>${username}</username>
    <password>${password}</password>
    <to>${email1}</to>
    <from>${from}</from>
    <subject>URGENT: ERROR NOTIFICATION </subject>

    <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTrackerImpl">

        <bufferSize>20</bufferSize>
    </cyclicBufferTracker>

    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
        <layout class="ch.qos.logback.classic.html.HTMLLayout">
            <pattern>%date%thread%level%logger%msg</pattern>
        </layout>
    </encoder>
</appender>

并在您的记录器中添加标记,例如

Marker marker= MarkerFactory.getMarker("MAIL_LOGS");

LOG.error(marker, "发送此消息");

这里所有标记为标记的日志都会被 SMTPAppender 记录下来。

【讨论】:

  • 有趣的是,每个人在这段代码中都有 &lt;!-- send just one log entry per email --&gt; 评论 :) 我也是。你能否定这个吗?你能声明一个不发送电子邮件的标记吗?
  • 对不起!那条评论是错误的。 SMTPAppender 由 ERROR 日志级别触发。一旦遇到任何错误日志,它就会发送电子邮件。 20 告诉你要发送多少日志。在这里它将发送最后 20 条日志消息。您的第二个问题“您能否声明不发送电子邮件的标记”,正如我所说的“标记”将过滤您要发送电子邮件的错误日志,如果没有标记意味着没有电子邮件通知。
  • 问题仍然存在 - 我可以将“发送电子邮件”设为默认设置,并添加一个标记以防我不想发送电子邮件吗?
  • 是的!!!绝对可以这样做,但是发送每个级别的事件可能会导致电子邮件过多,使目标用户的邮箱混乱,并且还会降低您的性能:
【解决方案2】:

是的!!!绝对可以这样做,但是发送每个级别的事件可能会导致电子邮件过多,使目标用户的邮箱混乱,并且还会影响您的表现。

以下是您可以完成任务的步骤:

第 1 步:将 janino jar 添加到您的类路径中,您可以在此处下载 http://janino.net/changelog.html

第 2 步:在 SMTPAppender 中添加以下评估器:

<evaluator  class="ch.qos.logback.classic.boolex.JaninoEventEvaluator">
  <expression>
     (marker == null) 
  </expression>
</evaluator>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    • 2015-06-14
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多