Spring 使用 log4j2 启动发送邮件

Spring boot sending mails with log4j2

我只想在使用 log4j2 的 spring 引导应用程序中通过电子邮件发送错误级别的日志。

阅读了无数关于此的教程后,我无法达到此目的。

我在本地有一个 Docker SMTP 服务器,这里是我的配置文件:

pom.xml

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.2.RELEASE</version>
    </parent>
    <dependencies>
    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!-- Add Log4j2 Dependency -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>

        <!-- Needed for SMTP appender -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        ...
        ...

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="trace">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                pattern="%style{%d{ISO8601}}{black} %highlight{%-5level }[%style{%t}{bright,blue}] %style{%C}{bright,yellow}: %msg%n%throwable" />
        </Console>
        <SMTP name="MailAppender"
            subject="error log"
            to="test@monitor.com"
            from="monitor@monitor.com"
            smtpHost="localhost"
            smtpPort="25"
            bufferSize="10"
            ignoreExceptions="false"
            smtpDebug="true"
            >
            <ThresholdFilter level="ERROR" onMatch="ACCEPT"/>
            <PatternLayout>
                <pattern>%d %p [%C] [%t] %m%n</pattern>
            </PatternLayout>
        </SMTP>
    </Appenders>

    <Loggers>
        <Root level="all">
            <AppenderRef ref="MailAppender" level="debug" />
        </Root>
    </Loggers>
</Configuration>

application.yml

spring:
  mail:
    host: localhost
    port: 25
    auth: false
    properties:
      mail:
        transport:
          protocol: smtp
        smtp:
          auth: false
          host: localhost
          port: 25

使用此配置,log4j2 无法发送任何邮件。显然,log4j2 在启动时正确配置:

2020-09-24 18:31:32,780 restartedMain DEBUG createAppender(Configuration(/XXX/target/classes/log4j2.xml), name="MailAppender", to="test@monitor.com", cc="null", bcc="null", from="monitor@monitor.com", replyTo="null", subject="error log", smtpProtocol="null", smtpHost="localhost", smtpPort="25", smtpUsername="null", smtpPassword="c0323768f8f5dc63ac2d877d8e65de66", smtpDebug="true", bufferSize="10", PatternLayout(%d %p [%C] [%t] %m%n), ThresholdFilter(ERROR), ignoreExceptions="false")

但是它无法发送任何电子邮件。

最有趣的是我可以使用spring mail 发送邮件(使用JavaMailSender API)相同的配置,所以我认为log4j2 配置有问题。也许 log4j2 出于任何原因覆盖了邮件配置?

有人能帮帮我吗?

好的,我终于解决了。它每次都在工作,但它无法识别我的应用程序记录器,因此它仅适用于 spring 框架日志名称,例如:org.springframework.boot

我解决了添加一个引用我的 SMTPAppender 的新记录器的问题:

        <Logger name="com.myapp" level="all" additivity="false">
            <AppenderRef ref="AsyncMailer" level="debug" />
        </Logger>

然后在 log.error("XXX") 上,它会发送一封包含日志信息的邮件。