问题描述
我的项目使用log4j 1.2.17.我已经成功地将我的自定义"评估器"注入了SMTPAppender,使用
但是,我想将一些参数传递给我的评估器,以使其可配置.我想使用 smtpappender.setevaluator ,但我不知道如何在log4j.xml中设置该设置.另一个选项是另一个smtpappender构造函数,我在使用log4j.xml 欢呼 引用 api doc doc doc <> api doc <> api doc smtpappender: 可以通过设置esteuatorClass来修改触发条件
具有实施类名称的属性
触发EventEvaluator,设置评估器属性
触发eventevaluator的实例或嵌套触发policy
指定类实现触发eventevaluator的元素. 基本上,我可以使用嵌套的触发policy元素来模仿评估器的行为.额外的优势是,我可以将参数传递给触发policy元素. 我有一个用用案例,每n-消息发送电子邮件摘要.为此,我使用了以下触发器: 我的log4j.xml配置,该配置为每两个日志事件发送一个邮件: 希望这会有所帮助!推荐答案
package org.email;
import org.apache.log4j.spi.LoggingEvent;
import org.apache.log4j.spi.TriggeringEventEvaluator;
public class MyEvaluator implements TriggeringEventEvaluator {
private volatile int num = 1;
private int quotient = 1;
@Override
public boolean isTriggeringEvent(LoggingEvent event) {
return num++ % quotient == 0;
}
public void setQuotient(int quotient) {
this.quotient = quotient;
}
}
<appender name="ErrorEmailAppender" class="org.apache.log4j.net.SMTPAppender">
<param name="SMTPHost" value="myHost" />
<param name="From" value="xxxxx@yyy.com" />
<param name="To" value="xxxxx@yyy.com" />
<param name="Subject" value="Log of messages" />
<triggeringPolicy class="org.email.MyEvaluator">
<param name="quotient" value="2" />
</triggeringPolicy>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%t %m%n"/>
</layout>
</appender>
问题描述
My project is using log4j 1.2.17. I have successfully injected my custom "Evaluator" into the SMTPAppender, using setEvaluatorClass :
<appender name="email" class="org.apache.log4j.net.SMTPAppender"> <param name="EvaluatorClass" value="path.to.my.Evaluator" />
However, I would like to pass some params to my Evaluator, to make it configurable. I would like to use SMTPAppender.setEvaluator, but I cannot figure out how to set that up in log4j.xml. Another option would be the other SMTPAppender constructor, which I have also been unsuccessful in using via log4j.xml
Cheers
推荐答案
Quoting the API doc of SMTPAppender:
The triggering criteria can be modified by setting the evaluatorClass property with the name of a class implementing TriggeringEventEvaluator, setting the evaluator property with an instance of TriggeringEventEvaluator or nesting a triggeringPolicy element where the specified class implements TriggeringEventEvaluator.
Basically, I can use a nested triggeringPolicy element to emulate the behavior of an evaluator. The added advantage is that, I can pass arguments to the triggeringPolicy element.
I had a use case of sending email digest for every n - messages. For that I used the following TriggeringPolicy:
package org.email; import org.apache.log4j.spi.LoggingEvent; import org.apache.log4j.spi.TriggeringEventEvaluator; public class MyEvaluator implements TriggeringEventEvaluator { private volatile int num = 1; private int quotient = 1; @Override public boolean isTriggeringEvent(LoggingEvent event) { return num++ % quotient == 0; } public void setQuotient(int quotient) { this.quotient = quotient; } }
My log4j.xml configuration, which sends one mail for every two log events is given below:
<appender name="ErrorEmailAppender" class="org.apache.log4j.net.SMTPAppender"> <param name="SMTPHost" value="myHost" /> <param name="From" value="xxxxx@yyy.com" /> <param name="To" value="xxxxx@yyy.com" /> <param name="Subject" value="Log of messages" /> <triggeringPolicy class="org.email.MyEvaluator"> <param name="quotient" value="2" /> </triggeringPolicy> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%t %m%n"/> </layout> </appender>
Hope this helps!