2019-07-03 log4j2 自定义ElasticSearch Appender

简易自定义ElasticSearchAppender

通过自定义appender可实现日志系统日志直接存储到ES

AbstractAppender

log4j2 提供了抽象类AbstractAppender,通过继承抽线类可实现自定义appender

例如:实现ElasticSearchAppender保存日志

@Plugin(name = "EsAppender", category = "Core", elementType = "appender", printObject = true)
public class EsAppender extends AbstractAppender {
    private static String host;
    private static Integer port;
    private static String index;
    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    protected EsAppender(String name, Filter filter, Layout<? extends Serializable> layout, boolean ignoreExceptions) {
        super(name, filter, layout, ignoreExceptions);
    }
    // 自定义log操作,存储到es
    @Override
    public void append(LogEvent event) {
        JSONObject jsonObject = new JSONObject();
        ThrowableProxy thrownProxy = event.getThrownProxy();
        jsonObject.put("time", sdf.format(new Date()));
        jsonObject.put("className", event.getLoggerName());
        jsonObject.put("methodName", event.getSource().getMethodName());
        jsonObject.put("logMessage", event.getMessage().getFormattedMessage());
        try {
            jsonObject.put("ip", InetAddress.getLocalHost());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        jsonObject.put("logLevel", event.getLevel().name());
        jsonObject.put("logThread", event.getThreadName());
        jsonObject.put("errorMsg", thrownProxy == null ? "" : thrownProxy.getMessage());
        jsonObject.put("exception", thrownProxy == null ? "" : thrownProxy.getName());
        jsonObject.put("stackTrace", thrownProxy == null ? "" : parseException(thrownProxy.getStackTrace()));
        EsClient esClient = new EsClient();
        esClient.send(jsonObject.toJSONString());
    }

    public String parseException(StackTraceElement[] stackTrace) {
        StringBuffer sb = new StringBuffer();
        sb.append("\n");
        Arrays.stream(stackTrace).forEach((e) -> sb.append(e.getClassName()).append(".").append(e.getMethodName()).append("(").append(e.getFileName()).append(":").append(e.getLineNumber()).append(")").append("\n")
        );
        return sb.toString();
    }

    /**
     * 接收配置文件中的参数
     *
     * @param name
     * @param filter
     * @param layout
     * @return
     */
    @PluginFactory
    public static EsAppender createAppender(@PluginAttribute("name") String name,
        @PluginElement("Filter") final Filter filter,
        @PluginElement("Layout") Layout<? extends Serializable> layout,
        @PluginAttribute("ignoreExceptions") boolean ignoreExceptions,
        @PluginAttribute("host") String host,
        @PluginAttribute("port") Integer port,
        @PluginAttribute("index") String index
    ) {
        if (name == null) {
            LOGGER.error("No name provided for ESAppender");
            return null;
        }
        if (layout == null) {
            layout = PatternLayout.createDefaultLayout();
        }
        EsAppender.host = host;
        EsAppender.port = port;
        EsAppender.index = index;
        return new EsAppender(name, filter, layout, ignoreExceptions);
    }
}

@Plugin

@Plugin注解实现定义appender名称,即log4j2.xml配置文件中配置时使用的appender名称,例:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="info" monitorInterval="30">
    <appenders>
        <!--这个输出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--输出日志的格式-->
            <PatternLayout pattern="%{[ %p ] [%-d{yyyy-MM-dd HH:mm:ss}] [%l] %m%n}"/>
        </console>
        <!-- 这个就是自定义的Appender -->
        <EsAppender name="es" >
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5p] {%F:%L} - %m%n" />
        </EsAppender>
    </appenders>

    <loggers>
        <!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
        <root level="debug">
            <appender-ref ref="Console"/>
            <appender-ref ref="es"/>
        </root>
    </loggers>
</configuration>

@PluginFactory

插件构建注解,定义创建appender逻辑。通过@PluginAttribute、@PluginElement 定义配置文件可传入的参数值。

append方法

通过重写append方法实现自定义日志操作,例如日志格式化,存储逻辑自定义。

简单的自定义appender实现方式,实际封装还可以考虑异步收集,批量收集、失败重试等功能完善。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,458评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,030评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,879评论 0 358
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,278评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,296评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,019评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,633评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,541评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,068评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,181评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,318评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,991评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,670评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,183评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,302评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,655评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,327评论 2 358

推荐阅读更多精彩内容

  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 4,990评论 0 6
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,053评论 1 13
  • 声明:原创文章,转载请注明出处。http://www.jianshu.com/u/e02df63eaa87 1、背...
    唐影若凡阅读 10,740评论 0 7
  • 上一章 他这是在愚我呢! 连载小说 目录 “哎,小米,我说啊,你还是跟那个叫什么来着的见见面呗。”白小米歪了个头...
    黄泉花开阅读 294评论 0 1
  • 一一和 随心友 词/玉奕 [中华通韵] 何时细雨生成雪?停也悠悠,飘也悠悠。 玉树银花任摘揪。 霜天冰雪无人走...
    吉羊玉奕v阅读 2,278评论 51 93