使用log4j2日志框架发送邮件
近几日,我一直在尝试通过log4j2的StmpAppender来实现发送服务器错误日志的功能,以下是我在网上搜寻到的普通邮件的发送配置
maven
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.8.1</version>
</dependency>
<!--log4j的邮件发送依赖-->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
用于普通邮件的log4j2配置,前提是首先需要一个开启了stmp/imap服务的邮箱账号,开通方式自行百度即可,这里不做介绍
<Configuration name="Log4jConfiguration" status="trace"
strict="true" schema="Log4J-V2.0.xsd">
<Appenders>
<!-- 控制台打印日志 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%c %m %n"/>
</Console>
<SMTP name="Mail" subject="logTest" to="*******@*******" from="********@********"
smtpProtocol="smtp" smtpHost="mail.qq.com" smtpPort="25"
bufferSize="1024" smtpDebug="false" smtpPassword="*******"
smtpUsername="****@z******">
<!--日志过滤,只发送ERROR邮件-->
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</SMTP>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
<AppenderRef ref="Mail"/>
</Root>
</Loggers>
</Configuration>
参数 | 说明 |
---|---|
name | appender的名称 |
subject | 主题 |
to | 邮件的接收方邮箱,多个账户使用“,”分割 |
from | 邮件发送所使用的账户 |
smtpProtocol | stmp协议 |
smtpHost | 邮件发送服务器域名 |
smtpPort | 邮件发送服务器端口 |
smtpPassword | 账户密码 |
smtpUsername | 账户名称 |
最终得到的邮件是这样的
@Log4j2
public class LogTest {
public static void main(String[] args) {
log.error("Hello World");
}
}
ssl加密邮件
让我无奈的是,公司所使用的邮箱只能是ssl的加密邮件,以上普通的邮件是不能在我公司的邮件服务器上使用,而使用QQ和网易的邮箱发送日志邮件会存在单日发送的邮件数量上限的问题,所以我一直在寻找log4j2的ssl邮件配置方式。
但不幸的就是,百度+google也没能找到相关的log4j2配置
实在没有办法就在google搜索“log4j2 send ssl email”(我初中英语就不及格,我自豪),希望能够搜到相关的老外的帖子,用chrome浏览器自带的翻译功能勉强看看。
这是我发现的一篇老外的帖子:https://stackoverflow.com/questions/50194418/log4j2-gmail-smtp-appender
可能需要科学上网才能打开网址, 我记直接展示截图了
帖子大概的意思是:“ 我找不到以下参数:mail.smtp.ssl.enable和mail.smtp.starttls.enable。 ”
根据帖子评论区的讨论,mail.smtp.ssl.enable和mail.smtp.starttls.enable是log4j.properties的配置ssl邮件配置参数,但是楼主试图将这两个参数用于log4j2.xml当中,导致了找不到参数异常的出现。
借助这个老外的思路,我的思路是,既然log4j这个老古董都支持ssl邮件,那么log4j2这个更强的,没理由不支持才对。
这个老外的问题,是不是只是属性名字不对而已?
对照STMP标签的其他属性名: “stmpHost”、“stmpPort”、“stmpUsername”。。。我似乎明白了什么!
于是,尝试如下配置,以网易企业邮箱为例
<Configuration name="Log4jConfiguration" status="trace"
strict="true" schema="Log4J-V2.0.xsd">
<Appenders>
<!-- 控制台打印日志 -->
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%c %m %n"/>
</Console>
<SMTP name="Mail" subject="logTest" to="******@******" from="*******@********"
<!--stmp为普通邮件stmps为加密邮件-->
smtpProtocol="smtps" smtpHost="smtphz.qiye.163.com" smtpPort="465"
bufferSize="1024" smtpDebug="false" smtpPassword="********"
smtpUsername="*****@******"
<!--开启ssl加密-->
smtpSsl="true" smtpStarttls="true">
<!--日志过滤-->
<Filters>
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
</SMTP>
</Appenders>
<Loggers>
<Root level="error">
<AppenderRef ref="Console"/>
<AppenderRef ref="Mail"/>
</Root>
</Loggers>
</Configuration>