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;
    }

}
