情况
我编写库来针对计算服务器工作。
我正在记录计算时间(例如,工作的开始和停止)。
我想独立于客户端应用程序的日志框架配置来记录此值。我已经通过以编程方式使用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.moocar
和org.graylog2.log
都没有给我想要的结果。使用后者,我可以轻松完成将附加器附加到记录器的任务。更新
作为附加字段的类型,
me.moocar
似乎仅限于String
。因此,如果我想要数字字段,则必须选择其他替代方法。 最佳答案
您需要根据其数据类型发送值。有所不同
{'cpuTime':'42'}
和
{'cpuTime':42}
我不知道Graylog中是否有可用的转换器(您可以通过
filters
在logstash中处理字段转换)。如果要在记录器级别解决问题,请查看http://logging.paluch.biz/examples/logback.html,特别是additionalFieldTypes
。