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

2023-11-26

我发现 log4j2 中的 SMTPAppender 有一些问题。每当记录具有以下级别的事件时error or fatal被创建without举办具有级别的活动info在没有邮件发送并且致命事件消失之前。

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

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

        <!-- mail server configuration -->
        <properties>
            <property name="receipients">[email protected]</property>
            <property name="from">[email protected]</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 个事件会打印到 stdout:

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

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

test fatal 1
test info 2
test fatal 2

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

提前感谢您的帮助。

*Jost

Note:

对于我使用的测试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>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Log4j2:SMTPAppender 不发送错误或致命级别的邮件 的相关文章

  • Python 中上下文相关的日志级别

    我正在用 Python 制作一个 Web 应用程序框架的原型 主要是为了教育目的 但我一直坚持一个我一直想要的功能 每条路由的日志级别 此功能的目标是识别我们正在执行诊断的一些特定入口点 例如 我想跟踪呼叫者拨打电话时发生的情况POST s
  • Jframe 内有 2 个 Jdialogs 的 setModal 问题

    当我设置第一个选项时 我遇到了问题JDialog模态 第二个非模态 这是我正在尝试实现的功能 单击 测试对话框 按钮 一个JDialog有名字自定义对话框 主要的将会打开 如果单击 是 选项自定义对话框主 其他JDialog named 自
  • Android studio - 如何保存先前活动中选择的数据

    这是我的代码片段 这Textview充当按钮并具有Onclicklistner在他们 当cpu1000时Textview单击它会导致cpu g1000其代码如下所示的类 public class Game 1000 extends AppC
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • 断言 Kafka 发送有效

    我正在使用 Spring Boot 编写一个应用程序 因此要写信给 Kafka 我这样做 Autowired private KafkaTemplate
  • 如何在字段值无效的情况下更改 Struts2 验证错误消息?

    我在 Web 表单上使用 Struts2 验证 如果字段假设为整数或日期 则
  • 使用数据库进行日志记录

    大多数日志似乎都是纯文本形式 而不是放入 MySQL 其他类型的数据库中 这是否有原因 在我看来 将它们放入数据库将使分析变得非常非常容易 但这会以牺牲速度还是其他什么为代价 我不太关心可移植性 显然你会有数据库连接的文本日志 我能想到两大
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 在Java中运行bat文件并等待

    您可能会认为从 Java 启动 bat 文件是一项简单的任务 但事实并非如此 我有一个 bat 文件 它对从文本文件读取的值循环执行一些 sql 命令 它或多或少是这样的 FOR F x in CD listOfThings txt do
  • 使用 Elastic Beanstalk 进行 Logback

    我在使用 Elastic Beanstalk 记录应用程序日志时遇到问题 我正在 AWS Elastic Beanstalk 上的 Tomcat 8 5 with Corretto 11 running on 64bit Amazon Li
  • 为什么\0在java中不同系统中打印不同的输出

    下面的代码在不同的系统中打印不同的输出 String s hello vsrd replace 0 System out println s 当我在我的系统中尝试时 Linux Ubuntu Netbeans 7 1 它打印 When I
  • 在 Spring 上下文中查找方法级自定义注释

    我想知道的是 所有的类 方法Spring http en wikipedia org wiki Spring Framework注释为 Versioned的bean 我创建了自定义注释 Target ElementType METHOD E
  • java XMLSerializer 避免复杂的空元素

    我有这个代码 DocumentBuilderFactory factory DocumentBuilderFactory newInstance DocumentBuilder builder factory newDocumentBuil
  • 为 Logstash 中的新字段设置 Elasticsearch Analyzer

    通过使用GROK filter 我们可以向Logstash添加新字段 但是 我想知道如何为该特定字段设置分析器 例如 我有一个新的 id 字段 其中有一个字段 例如a b 但是 Elasticsearch 附带的普通分析器会将其分解为a a
  • partitioningBy 必须生成一个包含 true 和 false 条目的映射吗?

    The 分区依据 https docs oracle com javase 8 docs api java util stream Collectors html partitioningBy java util function Pred
  • 子类构造函数(JAVA)中的重写函数[重复]

    这个问题在这里已经有答案了 为什么在派生类构造函数中调用超类构造函数时 id 0 当创建子对象时 什么时候在堆中为该对象分配内存 在基类构造函数运行之后还是之前 class Parent int id 10 Parent meth void
  • Log4j2 ThreadContext 映射不适用于parallelStream()

    我有以下示例代码 public class Test static System setProperty isThreadContextMapInheritable true private static final Logger LOGG
  • Java/Python 中的快速 IPC/Socket 通信

    我的应用程序中需要两个进程 Java 和 Python 进行通信 我注意到套接字通信占用了 93 的运行时间 为什么通讯这么慢 我应该寻找套接字通信的替代方案还是可以使其更快 更新 我发现了一个简单的修复方法 由于某些未知原因 缓冲输出流似
  • 抛出 Java 异常时是否会生成堆栈跟踪?

    这是假设我们不调用 printstacktrace 方法 只是抛出和捕获 我们正在考虑这样做是为了解决一些性能瓶颈 不 堆栈跟踪是在构造异常对象时生成的 而不是在抛出异常对象时生成的 Throwable 构造函数调用 fillInStack
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro

随机推荐

  • 用于 GADT 的 makeLenses (Haskell)

    是否有相当于makeLenses对于 GADT 如果我有一个简单的GADT like data D a b where D Ord a Ord b gt a gt b gt D a b 有没有办法通过传入构造函数和字段名称列表来自动生成镜头
  • Interface Builder 中 UIButton 的活力效果

    我的一个视图控制器中有一些模糊且充满活力的视觉效果视图 我的标签可以正常工作 充满活力 但每次我尝试向视图添加 UIButton 时 文本似乎是透明的 并且按钮的背景似乎有活力 我正在寻找 编辑 按钮在通知中心的效果 我附上了一些照片供参考
  • Facebook 登录注销在尝试再次登录时出现无效密钥哈希错误

    我有一个简单的 Facebook 登录 注销活动 运行成功 然而 在我从应用程序注销后 我尝试再次登录 但 facebook 给出了无效的密钥哈希错误 请注意 我第一次登录并注销成功 但在我注销并尝试再次登录后 Facebook 给出了该错
  • jQuery 滚动到 Div

    我正在制作一个常见问题解答页面 顶部有按钮可以跳转到某个类别 它会跳转到p我用作类别标签的标签 例如 p 对于我的一般类别 我不想直接跳到类别 而是想添加滚动效果 我想要类似的东西http www dynamicdrive com dyna
  • Dplyr summarise_each 聚合结果

    我有一个这样的数据框 metric1 metric2 metric3 field1 field2 1 1 07809668 4 2569882 7 1710095 L S1 2 0 56174763 1 2660273 0 3751915
  • 使用 python 和 eyes3 创建新的 ID3 标签

    我有一堆根本没有 ID3 标签的 mp3 文件 我正在尝试使用 eyed3 向文件添加 ID3 标签 但不知道使用什么方法 这是我的代码 import eyed3 file eyed3 load test mp3 file tag arti
  • Android - Activity 构造函数与 onCreate

    据我了解 安卓Activities有特定的生命周期onCreate应该被覆盖并用于初始化 但是构造函数中到底发生了什么 是否存在您可以 应该覆盖的情况Activity构造函数也是如此 或者你永远不应该碰它 我假设构造函数永远不应该被使用 因
  • Socket Java 客户端 - Python 服务器

    我正在尝试实现一个 java python 客户端 服务器套接字 客户端是java写的 服务端是python写的 Java客户端 import java io import java net import java lang public
  • AS3:定义命中区域

    我有一个包含位图的影片剪辑 我不想增加命中区域 我知道我可以在它后面添加一个透明形状 但这将通过 ios 的空气进行编译 我不想导致不必要的重绘 有没有办法将矩形定义为点击区域或其他解决方案 有一个特殊的 hitArea 字段用于此目的 c
  • ASP.net 通过内容页访问母版页变量

    我有一个母版页 然后我有一个公共变量 public partial class AdminMaster System Web UI MasterPage protected bool blnShowDialogue false In my
  • Swift 4 上的条形码

    我正在尝试将 mi 应用程序升级到 swift 4 但条形码读取器无法工作 我已经隔离了条形码读取器代码 但仍然无法工作 相机可以工作 但无法检测到条形码 该代码在 swift 3 iOS 10 上运行得很好 这是完整的代码 import
  • 安装 gem 给出“无法构建 gem 本机扩展。”

    I did sudo apt get install ruby ruby dev 我跑 sudo gem install jekyll 但它给出了这个输出 构建本机扩展 这可能需要一段时间 错误 错误 安装 jekyll 错误 无法构建 g
  • 列表中的元素对

    我想转换 1 2 3 4 to 1 2 2 3 3 4 or 1 2 2 3 3 4 在 Clojure 我有 partition 2 1 1 2 3 4 我怎样才能在哈斯克尔做到这一点 我怀疑标准api中有这样的功能 但我找不到它 标准技
  • 字节顺序标记搞砸了 Java 中的文件读取

    我正在尝试使用 Java 读取 CSV 文件 某些文件可能在开头有字节顺序标记 但不是全部 如果存在 字节顺序将与第一行的其余部分一起读取 从而导致字符串比较出现问题 当字节顺序标记存在时 是否有一种简单的方法可以跳过它 EDIT 我已经在
  • PHP中try-catch的性能

    在 php 5 中使用 try catch 语句时需要考虑哪些性能影响 我之前在网上读过一些关于这个主题的旧的 看似相互矛盾的信息 我目前使用的许多框架都是在 php 4 上创建的 缺乏 php 5 的许多优点 因此 我自己在 php 中使
  • Linux/Qt/C++下如何检测USB设备断开

    我正在编写一个系统 X Platform Windows Linux 该系统使用 FTDI USB 芯片与自定义设备进行通信 我使用他们的 D2XX 驱动程序进行设备打开 关闭 读 写 到目前为止 一切都很好 我需要知道设备何时断开连接 以
  • 如何将 C# 代码编译为库而不是可执行文件?

    我在 Visual Studio 2010 中有一个 C 控制台应用程序 它有一个 Main 方法以及一堆实用程序类 我希望这些实用程序类可用于其他解决方案 从网上阅读看来我需要将其编译为类库 DLL 这就是我所做的 进入 Visual S
  • Laravel JSON 响应不带反斜杠

    我正在使用 AJAX 将数据发送到我的控制器 PHP代码 return response gt json request gt root summer uploads store 它返回 http domain test summer up
  • 为什么我无法使用 JQuery .html 添加

    为什么这段代码有效 div error container html div class error No more foo allowed div 但这段代码会导致错误 div error container html div class
  • Log4j2:SMTPAppender 不发送错误或致命级别的邮件

    我发现 log4j2 中的 SMTPAppender 有一些问题 每当记录具有以下级别的事件时error or fatal被创建without举办具有级别的活动info在没有邮件发送并且致命事件消失之前 这是我的 log4j2 配置文件 l