All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.logstash.logback.composite.loggingevent.MdcJsonProvider Maven / Gradle / Ivy

Go to download

Provides logback encoders, layouts, and appenders to log in JSON and other formats supported by Jackson

There is a newer version: 8.0
Show newest version
/*
 * Copyright 2013-2022 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.logstash.logback.composite.loggingevent;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.logstash.logback.composite.AbstractFieldJsonProvider;
import net.logstash.logback.composite.FieldNamesAware;
import net.logstash.logback.fieldnames.LogstashFieldNames;

import ch.qos.logback.classic.spi.ILoggingEvent;
import com.fasterxml.jackson.core.JsonGenerator;
import org.slf4j.MDC;

/**
 * Includes {@link MDC} properties in the JSON output according to
 * {@link #includeMdcKeyNames} and {@link #excludeMdcKeyNames}.
 *
 * 

There are three valid combinations of {@link #includeMdcKeyNames} * and {@link #excludeMdcKeyNames}:

* *
    *
  1. When {@link #includeMdcKeyNames} and {@link #excludeMdcKeyNames} * are both empty, then all entries will be included.
  2. *
  3. When {@link #includeMdcKeyNames} is not empty and * {@link #excludeMdcKeyNames} is empty, then only those entries * with key names in {@link #includeMdcKeyNames} will be included.
  4. *
  5. When {@link #includeMdcKeyNames} is empty and * {@link #excludeMdcKeyNames} is not empty, then all entries except those * with key names in {@link #excludeMdcKeyNames} will be included.
  6. *
* *

It is a configuration error for both {@link #includeMdcKeyNames} * and {@link #excludeMdcKeyNames} to be not empty.

* *

By default, for each entry in the MDC, the MDC key is output as the field name. * This can be changed by specifying an explicit field name to use for an MDC key * via {@link #addMdcKeyFieldName(String)}

* *

If the fieldName is set, then the properties will be written * to that field as a subobject. * Otherwise, the properties are written inline.

*/ public class MdcJsonProvider extends AbstractFieldJsonProvider implements FieldNamesAware { /** * See {@link MdcJsonProvider}. */ private List includeMdcKeyNames = new ArrayList<>(); /** * See {@link MdcJsonProvider}. */ private List excludeMdcKeyNames = new ArrayList<>(); private final Map mdcKeyFieldNames = new HashMap<>(); @Override public void start() { if (!this.includeMdcKeyNames.isEmpty() && !this.excludeMdcKeyNames.isEmpty()) { addError("Both includeMdcKeyNames and excludeMdcKeyNames are not empty. Only one is allowed to be not empty."); } super.start(); } @Override public void writeTo(JsonGenerator generator, ILoggingEvent event) throws IOException { Map mdcProperties = event.getMDCPropertyMap(); if (mdcProperties != null && !mdcProperties.isEmpty()) { boolean hasWrittenStart = false; for (Map.Entry entry : mdcProperties.entrySet()) { if (entry.getKey() != null && entry.getValue() != null && (includeMdcKeyNames.isEmpty() || includeMdcKeyNames.contains(entry.getKey())) && (excludeMdcKeyNames.isEmpty() || !excludeMdcKeyNames.contains(entry.getKey()))) { String fieldName = mdcKeyFieldNames.get(entry.getKey()); if (fieldName == null) { fieldName = entry.getKey(); } if (!hasWrittenStart && getFieldName() != null) { generator.writeObjectFieldStart(getFieldName()); hasWrittenStart = true; } generator.writeFieldName(fieldName); generator.writeObject(entry.getValue()); } } if (hasWrittenStart) { generator.writeEndObject(); } } } @Override public void setFieldNames(LogstashFieldNames fieldNames) { setFieldName(fieldNames.getMdc()); } public List getIncludeMdcKeyNames() { return Collections.unmodifiableList(includeMdcKeyNames); } public void addIncludeMdcKeyName(String includedMdcKeyName) { this.includeMdcKeyNames.add(includedMdcKeyName); } public void setIncludeMdcKeyNames(List includeMdcKeyNames) { this.includeMdcKeyNames = new ArrayList(includeMdcKeyNames); } public List getExcludeMdcKeyNames() { return Collections.unmodifiableList(excludeMdcKeyNames); } public void addExcludeMdcKeyName(String excludedMdcKeyName) { this.excludeMdcKeyNames.add(excludedMdcKeyName); } public void setExcludeMdcKeyNames(List excludeMdcKeyNames) { this.excludeMdcKeyNames = new ArrayList<>(excludeMdcKeyNames); } public Map getMdcKeyFieldNames() { return mdcKeyFieldNames; } /** * Adds the given mdcKeyFieldName entry in the form mdcKeyName=fieldName * to use an alternative field name for an MDC key. * * @param mdcKeyFieldName a string in the form mdcKeyName=fieldName that identifies what field name to use for a specific MDC key. */ public void addMdcKeyFieldName(String mdcKeyFieldName) { String[] split = mdcKeyFieldName.split("="); if (split.length != 2) { throw new IllegalArgumentException("mdcKeyFieldName (" + mdcKeyFieldName + ") must be in the form mdcKeyName=fieldName"); } mdcKeyFieldNames.put(split[0], split[1]); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy