Jos*_*ost 6 java logging smtpappender log4j2
我在log4j2中发现了SMTPAppender的一些问题.每当记录具有级别的事件error或者在没有发送没有邮件的事件的情况下fatal创建事件并且致命事件消失时.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>
Run Code Online (Sandbox Code Playgroud)
我使用这个小程序来重现问题(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();
}
}
Run Code Online (Sandbox Code Playgroud)
如果取消注释两个标记位置,一切都按预期工作:发送两封邮件 - 每封邮件包含致命事件和先前的信息事件.此外,4个事件打印到stdout:
test info 1
test fatal 1
test info 2
test fatal 2
Run Code Online (Sandbox Code Playgroud)
现在,如果您只激活/取消注释第二个位置 - 第二个邮件(fatal2)按预期发送(再次使用先前的info2事件),但即使第一个致命事件打印到stdout,邮件也会被吃掉.输出如下:
test fatal 1
test info 2
test fatal 2
Run Code Online (Sandbox Code Playgroud)
就个人而言,对我而言,似乎我遇到了错误并且错误配置了log4j2,或者它可能是一个错误.
感谢您的帮助.
*约斯特
注意:
对于测试,我使用从项目网站下载的log4j2-beta7.文档可以在这里找到.
乍一看这看起来像是一个错误。如果您删除 LogTest 记录器并像这样配置根记录器,还会发生这种情况吗?
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="AsyncMailer"/>
</root>
Run Code Online (Sandbox Code Playgroud)
仅供参考,如果以后您需要在不同的附加程序上使用不同的日志级别,您可以像这样实现(不需要单独的记录器):
<root level="trace">
<appender-ref ref="A" level="info" />
<appender-ref ref="B" level="debug" />
</root>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3606 次 |
| 最近记录: |