在今天的帖子中,我将向您展示如何将日志语句过滤为警告电子邮件。 这是出于监视我正在处理的一个应用程序的一些关键点的需要。 您可以使用一些工具来执行应用程序监视。 我不会详细介绍这些工具,但有时让应用程序发送警告电子邮件会更容易。
我主要将log4j用于记录需求。 不幸的是,由于Java生态系统中有许多日志记录框架,因此本文仅涵盖其中的一部分。 将来我可能会为其他人做些事情,但是我想强调一下AntónioGonçalves关于记录API标准化的旧文章: 我需要您作为Logging API Spec Lead! 。 这里介绍的示例适用于log4j ,但是github项目还包含一个log4j2示例。
用例
为了提供更多细节,我想在应用程序生成错误时得到通知,但也忽略应用程序本身已经处理的错误。 对于一个更具体的示例,我遇到一种情况,其中数据库插入会生成约束违例异常,但是此错误由应用程序专门处理。 即使这样,JDBC驱动程序也会记录该异常。 对于这种情况,我不希望收到通知。
设置SMTPAppender
无论如何,查看log4j ,您可以创建一个将所有日志发送到电子邮件的附加程序,只需选中SMTPAppender即可 。 看起来像这样:
log4j-SMTPAppender
<appender name="SMTP" class="org.apache.log4j.net.SMTPAppender">
<errorHandler class="org.apache.log4j.helpers.OnlyOnceErrorHandler"/>
<param name="Threshold" value="ERROR"/>
<param name="To" value="someone@somemail.com"/>
<param name="From" value="someonelse@somemail.com"/>
<param name="Subject" value="Log Errors"/>
<param name="SMTPHost" value="smtp.somemail.com"/>
<param name="SMTPUsername" value="username"/>
<param name="SMTPPassword" value="password"/>
<param name="BufferSize" value="1"/>
<param name="SMTPDebug" value="true"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}:%L] %m%n"/>
</layout>
</appender>
筛选
我们的过滤需求在标准log4j库中不可用。 您需要使用log4j-extras ,它为您提供了支持过滤复杂表达式的ExpressionFilter 。 我们还使用常规log4j库中的StringMatchFilter 。
现在,我们可以向SMTPAppender添加一个triggeringPolicy
:
log4j-triggeringPolicy
<triggeringPolicy class="org.apache.log4j.rolling.FilterBasedTriggeringPolicy">
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="ERROR01"/>
<param name="AcceptOnMatch" value="false"/>
</filter>
<filter class="org.apache.log4j.filter.ExpressionFilter">
<param name="expression"
value="CLASS LIKE .*Log4jExpressionFilter.*"/>
<param name="acceptOnMatch" value="false"/>
</filter>
<filter class="org.apache.log4j.filter.LevelRangeFilter">
<param name="levelMin" value="ERROR"/>
<param name="levelMax" value="FATAL"/>
</filter>
</triggeringPolicy>
此配置将过滤日志以电子邮件只有ERROR
和FATAL
阈值中的类不登录与Log4jExpressionFilter
在它的名字,并没有ERROR01
的日志信息。
查看LoggingEventFieldResolver ,看看可以与ExpressionFilter一起使用的其他表达式 。 您可以使用EXCEPTION,METHOD和其他一些非常有用的工具。
测试中
如果您依赖真实的服务器,则测试SMTPAppender并不容易。 幸运的是,您可以使用模拟javamail ,甚至不必担心会污染SMTP服务器。 这也包含在github项目中。
资源资源
您可以从我的github存储库中为log4j和log4j2克隆完整的工作副本。
Log4j邮件过滤器
由于我将来可能会修改代码,因此您可以从1.0版中下载本文的原始源。 或者,克隆存储库,并使用以下命令从发行版1.0中检出标记: git checkout 1.0
。