package com.app.mvc.common;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.filter.Filter;
import ch.qos.logback.core.spi.FilterReply;
import com.app.mvc.config.GlobalConfig;
import com.app.mvc.config.GlobalConfigKey;
import com.google.common.base.Splitter;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
/**
* 基于logback的报警邮件过滤器,该过滤器主要提供如下功能:
* (1)等级过滤,目前只接受error的日志
* (2)内容过滤,可以通过正则表达式匹配对应的内容从而打倒过滤效果
* (3)日志内容过滤的动态配置功能,该功能主要依赖配置库。
* 配置表中保存的内容是:
* logback.filter.msg="filter1";"filter2";..."filterN"
*/
public class LogEmailFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if (!event.getLevel().equals(Level.ERROR)) {
return FilterReply.DENY;
}
// 是否开通邮件通知
boolean isOpenEmail = GlobalConfig.getBooleanValue(GlobalConfigKey.LOGBACK_EMAIL_OPEN, false);
if (!isOpenEmail) {
return FilterReply.DENY;
}
// 是否过滤指定的logger
String filterString = GlobalConfig.getStringValue(GlobalConfigKey.LOGBACK_FILTER_MSG, "");
if (StringUtils.isBlank(filterString)) {
return FilterReply.ACCEPT;
}
String message = event.getMessage();
List<String> list = Splitter.on(";").splitToList(filterString);
for (String filterMsg : list) {
if (filterMsg.length() > 2) {
// 每项均为“”包裹
filterMsg = filterMsg.substring(1, filterMsg.length() - 1);
if (message.contains(filterMsg)) {
return FilterReply.DENY;
}
}
}
return FilterReply.ACCEPT;
}
}