如何以编程方式将数字字段记录到Graylog中?

时间:2017-06-08 14:16:03

标签: java graylog gelf

情况

我编写库来对抗计算服务器。 我正在记录计算时间(例如,开始和停止工作)。 我想独立于客户端应用程序的日志框架配置记录此值。我通过编程方式使用Graylog实现了这一目标。所以我在我的库中配置和初始化我的记录器,而客户端仍然没有注意到。

这是我的初始化代码

import org.graylog2.log.GelfAppender;

void init() {
    final GelfAppender appender = new GelfAppender();

    appender.setName("MyServerAppender");
    appender.setGraylogHost("bigcpuserver");
    appender.setGraylogPort(2020);
    appender.setExtractStacktrace(true);
    appender.setAddExtendedInformation(true);
    appender.setAdditionalFields("{'environment': 'TEST',"
            + "'ip_address': '10.20.30.40',"
            + "'serverName': 'devPc',"
            + "'libVersion': '1.0.0',"
            + "'application': 'loggingTestApp',"
            + "'appversion': '2.0.7'}");
    appender.activateOptions();
    final org.apache.log4j.Logger myLog =
        org.apache.log4j.Logger.getLogger(MyHiddenLoggerClass.class);
    myLog.addAppender(appender);

}

到目前为止一切顺利。我可以通过以下行从我的代码中的任何地方向Graylog发送日志:

org.apache.log4j.Logger.getLogger(MyHiddenLoggerClass.class).info("message");

问题

我想在我的日志中添加数字字段,以便Graylog可以对它们运行统计信息。比如,例如,找出哪些作业花费时间最长 - 可能需要算法优化 - 或者最短 - 可能根本不需要计算服务器 - 。

我可以通过以下方式向MDC添加字段:

org.apache.log4j.MDC.put("cpuTime", startTimeMillis-endTimeMillis);

从那时起,所有日志都将包含具有该值的cpuTime字段。我在发送特定日志条目后删除它,以防止在后续日志条目中携带它:

org.apache.log4j.MDC.remove("cpuTime");

但是,对于Graylog来说,这些是字符串,因此它只能计算它们并查看它们有多少不同。

问题

如何告诉Graylog“cpuTime”始终是long

到目前为止的尝试次数

我尝试在init()时预先配置字段。

为此,我测试了其他类层次结构,例如me.moocar。例如,我尝试了以下内容:

    final me.moocar.logbackgelf.GelfAppender appender =
        new me.moocar.logbackgelf.GelfAppender();

    appender.setName("MyServerAppender");
    appender.setIncludeFullMDC(true);
    appender.setGraylog2ServerHost("bigcpuserver");
    appender.setGraylog2ServerPort(2020);
    final Map<String, String> additionalFields = new HashMap<String, String>();
    final Map<String, String> fieldTypes = new HashMap<String, String>();
    additionalFields.put("cpuTime", "42");
    fieldTypes.put("cpuTime", "long");
    appender.setAdditionalFields(additionalFields);
    appender.setFieldTypes(fieldTypes);
    appender.start();

    final ch.qos.logback.classic.LoggerContext logCtx =
            (LoggerContext) LoggerFactory.getILoggerFactory();
    appender.setContext(logCtx);

    ch.qos.logback.classic.Logger logToConfigure =
            logCtx.getLogger(MyHiddenLoggerClass.class);
    logToConfigure.addAppender(appender);

所以我可以在我的测试代码中执行以下操作:

    final ch.qos.logback.classic.Logger log =
             logCtx.getLogger(MyHiddenLoggerClass.class);
    MDC.put("cpuTime", totalTime);
    log.error("task finished.");

在Graylog中,日志“任务已完成”。将伴随一个名为“cpuTime”的字段,并在日志时刻包含值为totalTime字符串。我只想将包含的值设为数字。任何人都可以帮助我吗?

如果这有帮助,我可以将整个更改为me.moocar层次结构。但到目前为止,me.moocarorg.graylog2.log都没有给我我想要的结果;使用后者,我可以更轻松地将appender连接到记录器。

更新

me.moocar似乎仅限于String作为附加字段的类型。因此,如果我想要数字字段,我必须选择其他替代方案。

1 个答案:

答案 0 :(得分:2)

您需要根据数据类型发送值。

有所不同
{'cpuTime':'42'}

{'cpuTime':42}

我不知道Graylog中是否有可用的变换器(您可以通过filters处理logstash中的字段转换)。如果您想在记录器级别解决问题,请查看http://logging.paluch.biz/examples/logback.html,特别是additionalFieldTypes