1

我已经创建了一个自定义 PatternLayout,我在 logback 的 Access 和 File appender 中使用它,我也想将它用于 LoggingEventCompositeJsonEncoder。

是否可以使用我的布局配置编码器,我该如何实现?

文件 appender 配置示例:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
      <layout class="com.me.util.logging.PatternLayoutFiltered">
      <pattern>${LOG_PATTERN}</pattern>
      </layout>
   </encoder>
   <file>${LOG_FILE}</file>
   <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- rotate every day -->
      <fileNamePattern>${logback.rollingPolicy.file.fileNamePattern}</fileNamePattern>
      <!-- Days of history -->
      <maxHistory>${logback.maxHistory.retention:-7}</maxHistory>
   </rollingPolicy>
</appender>

我的logstash编码器:

<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
   <providers>
      <timestamp>%d{ISO8601}</timestamp>
      <message/>
      <loggerName/>
      <context/>
      <mdc/>
      <pattern>
         <pattern>
            {
            "appVersion": "${build.version}",
            "appName": "${build.artifact}",
            "resourceType": "${logback.application.resource.type}",
            "resourceID": "${logback.application.resource.id}",
            "level": "%level",
            "hostname": "${logback.server.host}",
            "indexType": "${logback.logstash.index.type}"
            }
         </pattern>
         </layout>
      </pattern>
      <stackTrace/>
   </providers>
</encoder>

我在哪里可以在这里定义相同的 PatternLayout ?我在这里读过

模板中的每个值都被视为 logback 标准 PatternLayout 的模式,因此它可以是文字字符串(对于某些常量)和各种转换说明符(如 %d 表示日期)的组合。

那么我如何配置我自己的呢?谢谢你的帮助。

4

1 回答 1

1

为了解决这个问题,我不得不使用自定义valueMasker进行过滤,并应用与我的布局相同的过滤方法来过滤字段值。

添加到 logback.xml :

<jsonGeneratorDecorator class="net.logstash.logback.mask.MaskingJsonGeneratorDecorator">
    <valueMasker class="com.me.util.logging.CustomValueMasker"/></jsonGeneratorDecorator>

Java 类类似于:

package com.me.util.logging;

import com.fasterxml.jackson.core.JsonStreamContext;
import net.logstash.logback.mask.ValueMasker;

public class CustomValueMasker implements ValueMasker {

   @Override
   public Object mask(JsonStreamContext jsonStreamContext, Object o) {
      if (o instanceof CharSequence) {
         return doTransform((String) o);
      }
      return o;
   }

   /**
    * Do the message filtering
    *
    * @param msg the message of the event log
    *
    * @return the filtered message
    */
   private String doTransform(String msg) {
      // Do whatever filtering needed here
      return msg;
   }
}
于 2020-05-12T08:27:31.147 回答