当前位置: 首页 > 知识库问答 >
问题:

是否有一个Logback布局来创建以消息参数作为属性的JSON对象?

魏彦
2023-03-14

我想将日志事件作为带有参数化字符串消息的JSON对象发送到Loggly。我们的项目目前有很多代码是这样的:

String someParameter = "1234";
logger.log("This is a log message with a parameter {}", someParameter);

我们目前使用Logback作为SLF4J后端,使用Logback的JsonLayout将ILogEvent对象序列化为JSON。因此,当我们的日志事件发送到Loggly时,它们看起来是这样的:

{
    "message": "This is a log message with a parameter 1234",
    "level": INFO,
    ....
}

虽然这确实有效,但它为someParameter的每个值发送不同的消息字符串,这使得Loggly的自动过滤器几乎无用。

相反,我希望有一个创建JSON的Layout,它看起来像这样:

{
    "message": "This is a log message with a parameter {}",
    "level": INFO,
    "parameters": [
        "1234"
    ]
}

此格式允许Loggly将所有日志事件与消息一起分组这是一条带有参数的日志消息,而不管someParameter的值是多少。

看起来Logstash的KV过滤器是这样做的-除了编写自己的布局来执行ILogEvent对象的自定义序列化之外,有没有其他方法可以通过Logback完成这项任务?

共有3个答案

程修雅
2023-03-14

您可以使用映射诊断上下文为每种类型的日志消息设置一个标记,然后您可以对其进行一次日志过滤。

根据JsonLayout的来源,戳记作为单独的值存储在JSON中。

商品
2023-03-14

所以对我来说,我试图记录执行时间,我创建了一个名为执行时间的pojo,上面有名称、方法、类、持续时间。

然后我就可以创建它了:

ExecutionTime time = new ExecutionTime("Controller Hit", methodName, className, sw.getTotalTimeMillis());

对于日志记录,我使用了:

private final Logger logger = LoggerFactory.getLogger(this.getClass());
logger.info(append("metric", time), time.toString());

确保您有:

import static net.logstash.logback.marker.Markers.append;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

这将记录如下内容:

{  
   "ts":"2017-02-16T07:41:36.680-08:00",
   "msg":"ExecutionTime [name=Controller Hit, method=setupSession, className=class com.xxx.services.controllers.SessionController, duration=3225]",
   "logger":"com.xxx.services.metrics.ExecutionTimeLogger",
   "level":"INFO",
   "metric":{  
      "name":"Controller Hit",
      "method":"setupSession",
      "className":"class com.xxx.services.controllers.SessionController",
      "duration":3225
   }
}

可能是一个不同的设置,因为我正在使用logback spring。将日志输出到json的xml:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <property name="PROJECT_ID" value="my_service"/>
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>app/logs/${PROJECT_ID}.json.log</File>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <fieldNames>
                <timestamp>ts</timestamp>
                <message>msg</message>
                <thread>[ignore]</thread>
                <levelValue>[ignore]</levelValue>
                <logger>logger</logger>
                <version>[ignore]</version>
            </fieldNames>
        </encoder>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <maxIndex>10</maxIndex>
            <FileNamePattern>app/logs/${PROJECT_ID}.json.log.%i</FileNamePattern>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>20MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
    <logger name="com.xxx" additivity="false" level="DEBUG">
        <appender-ref ref="FILE"/>
        <appender-ref ref="CONSOLE"/>
    </logger>
    <root level="WARN">
        <appender-ref ref="FILE"/>
    </root>
</configuration>
张财
2023-03-14

Logback有一个JSON logstash编码器,logstash-logback编码器

 类似资料:
  • 问题内容: 我想将日志事件作为带有参数化字符串消息的JSON对象发送到Loggly。我们的项目目前有很多代码如下: 我们目前正在使用Logback作为SLF4J后端,并使用Logback的JsonLayout将ILogEvent对象序列化为JSON。因此,当他们将我们的日志事件发送到Loggly时,它们看起来像这样: 尽管这样做确实有效,但它会为的每个值发送一个不同的字符串,这使Loggly的自动

  • 出于业务逻辑的原因,我希望能够创建一个具有属性的对象。但我显然不能 因为是在Python中具有特殊含义的保留关键字。但是,使用或动态获取属性也存在同样的问题。我可以这样做吗,还是必须让属性名?

  • 问题内容: 在JavaScript中,声明在全局对象上创建属性: ES6引入了具有作用域范围的声明的词法作用域。 但是,这些声明是否在全局对象上创建属性? 问题答案: 语句是否在全局对象上创建属性? 根据规范,否: 全局环境记录在逻辑上是单个记录,但是它被指定为封装对象环境记录和声明性环境记录的复合记录。该对象环境记录作为其基本对象相关的全局对象境界。该全局对象是全局环境记录的GetThisBin

  • 让我们假设我有一个实体类Foo,它包含一些字段、getter、setter和构造函数。例如: 然后我想知道a或b何时改变。我知道javaFX中有一个ObjectProperty。所以我要创建对象属性: 然后,为了了解a和b字段的更改,我添加了ChangeListener: 然后进行实验: 工作正常,但下一行: 不调用侦听器。原因很清楚。最后一行实际上没有更改Foo对象(引用保持不变)。 我有一些可

  • 问题内容: 我刚刚发现了Swift 函数。似乎很有用。 它需要2个输入数组,并从每个数组的值对中创建一个元组数组。 是否有zip的变体,可以接受任意数量的数组并输出具有相同数量元素的元组?似乎应该有一种方法可以做到这一点。 问题答案: 不,由于Swift缺乏可变参数泛型,因此目前无法实现任意数量的序列。泛型宣言中对此进行了讨论。 同时,我编写了一个模板来生成自定义Arity的ZipSequence

  • 本文向大家介绍JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法,包括了JS hasOwnProperty()方法检测一个属性是否是对象的自有属性的方法的使用技巧和注意事项,需要的朋友参考一下 JavaScript hasOwnProperty() 方法是 Object 的原型方法(也称实例方法),它定义在 Object.prototype 对象之上,所有 Objec