gpt4 book ai didi

java - Log4j2:SMTPAppender 不发送错误或致命级别的邮件

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:25:56 25 4
gpt4 key购买 nike

我发现 log4j2 中的 SMTPAppender 存在一些问题。每当创建级别为 errorfatal 的日志事件时 without 在 no mail 之前没有级别为 info 的事件被发送并且致命事件消失。

这是我的 log4j2 配置文件 (log4j2.xml) 和一个小程序 (LogTest.java) 来重现问题:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="warn">

<!-- mail server configuration -->
<properties>
<property name="receipients">me@example.com</property>
<property name="from">me@example.com</property>
<property name="smtpHost">smtp.example.com</property>
<property name="smtpPort">25</property>
<property name="smtpProtocol">smtp</property>
<property name="smtpUser">me</property>
<property name="smtpPassword">secret</property>
</properties>

<appenders>

<!-- appender to write all info events to stdout -->
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="info" onMatch="NEUTRAL" onMismatch="DENY"/>
</Console>

<!-- appender to send mails (default: error and fatal events)-->
<SMTP name="Mailer" suppressExceptions="false"
subject="Error log" to="${receipients}" from="${from}"
smtpHost="${smtpHost}" smtpPort="${smtpPort}"
smtpProtocol="${smtpProtocol}" smtpUsername="${smtpUser}"
smtpPassword="${smtpPassword}" smtpDebug="false" bufferSize="2">
</SMTP>
<!-- appender to send mails asynchronously -->
<Async name="AsyncMailer" >
<appender-ref ref="Mailer"/>
</Async>

</appenders>
<loggers>

<!-- logger to send mail on (at least) info level events -->
<logger name="LogTest" level="info" additivity="true">
<appender-ref ref="AsyncMailer"/>
</logger>

<!-- root logger to see what happens (info level and "above") -->
<root level="info">
<appender-ref ref="Console"/>
</root>

</loggers>
</configuration>

我用这个小程序重现了这个问题(LogTest.java):

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

class LogTest
{
private static Logger logger=LogManager.getLogger("LogTest");

public void testlogger()
{
/* --> uncomment to enable first mail
logger.info("test info 1");
*/
logger.fatal("test fatal 1");

/* --> uncomment to enable second mail
logger.info("test info 2");
*/
logger.fatal("test fatal 2");
}

public static void main(String[] args)
{
LogTest app=new LogTest();
app.testlogger();
}

}

如果您取消对两个标记位置的注释,一切都会按预期进行:发送两封邮件 - 每封邮件都包含致命事件和先前的信息事件。此外,4 个事件被打印到标准输出:

test info 1
test fatal 1
test info 2
test fatal 2

现在,如果您只激活/取消注释第二个位置 - 第二封邮件 (fatal2) 将按预期发送(再次使用之前的 info2 事件),但即使第一个致命事件打印到标准输出,邮件也会被吃掉.输出如下所示:

test fatal 1
test info 2
test fatal 2

就我个人而言,似乎是我出错了,错误地配置了 log4j2,或者它可能是一个错误。

提前感谢您的帮助。

*约斯特

注意:

对于我使用的测试 log4j2-beta7从项目的网站下载。可以找到文档 here .

最佳答案

乍一看这像是一个错误。如果您删除 LogTest 记录器并像这样配置您的根记录器,它还会发生吗?

<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="AsyncMailer"/>
</root>

仅供引用,如果稍后您需要在不同的附加程序上使用不同的日志级别,您可以像这样实现(不需要单独的记录器):

<root level="trace">
<appender-ref ref="A" level="info" />
<appender-ref ref="B" level="debug" />
</root>

关于java - Log4j2:SMTPAppender 不发送错误或致命级别的邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17657983/

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