gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:22:27 24 4
gpt4 key购买 nike

情况

我编写库来针对计算服务器工作。我正在记录计算时间(例如作业的开始和停止)。我想独立于客户端应用程序的日志框架配置来记录此值。我通过以编程方式使用 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 都没有给我想要的结果;使用后者,我可以更轻松地将附加程序附加到记录器。

更新

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

最佳答案

您需要根据数据类型发送值。有一点不同

{'cpuTime':'42'}

{'cpuTime':42}

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

关于java - 如何以编程方式将数字字段记录到 Graylog 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44438211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com