繁体   English   中英

Java Spring Boot Logback

[英]Java Spring Boot Logback

有没有办法打印不同logging.pattern给出了具体的logging.level

我在Spring Boot项目中使用的yml文件如下所示

logging:
  level:
    com.netflix: warn
    org.springframework: warn
    org.apache: warn
    org.mongodb: warn
    com.twocatholler: debug
  pattern:
    console: "%d{dd-MM-yyyy HH:mm:ss.SSS} %white([%thread]) %highlight(%-5level) %white(%logger) - %white(%msg) %n"

如果有多个appender是可以接受的,那么为不同级别设置不同模式的直接方法是使用具有ThresholdFilters的两个不同的appender。

当更多appender写入同一文件时可能会出现问题。 请查看此问题,例如: https//jira.qos.ch/browse/LOGBACK-114

但是,您可以拥有自己的appender,根据其级别以不同方式格式化日志记录事件。

检查此LevelPatternLayout演示: https//github.com/riskop/logback_LevelPatternLayout

示例logback.xml:

<configuration scan="true" debug="true">
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="pack.LevelPatternLayout">
                <defaultPattern>DEFAULT PATTERN %c - %m\n</defaultPattern>
                <debugPattern>DEBUG PATTERN %c - %m\n</debugPattern>
            </layout>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

测试代码:

public void test() throws Exception{
    log.debug("some debug level log");
    log.info("some info level log");
    log.error("some error level log");
}

输出:

DEBUG PATTERN pack.TestStart - some debug level log
DEFAULT PATTERN pack.TestStart - some info level log
DEFAULT PATTERN pack.TestStart - some error level log

LevelPatternLayout代码:

package pack;

import java.util.HashMap;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.PatternLayout;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.LayoutBase;

/**
 * A logback layout which can be configured with different pattern for different levels.
 * 
 * E.g. you can configure a pattern for DEBUG messages and an *other* pattern
 * for INFO messages and so on. 
 * 
 *
 */
public class LevelPatternLayout extends LayoutBase<ILoggingEvent> {

    private boolean started;

    // store for patternLayouts per level. The layout stored with 'null' key is the fallback
    private HashMap<Level, PatternLayout> layouts = new HashMap<>();

    public LevelPatternLayout() {
    }

    public void setDefaultPattern(String pattern) {
        setLevelPattern(null, pattern);
    }

    public void setTracePattern(String pattern) {
        setLevelPattern(Level.TRACE, pattern);
    }

    public void setDebugPattern(String pattern) {
        setLevelPattern(Level.DEBUG, pattern);
    }

    public void setInfoPattern(String pattern) {
        setLevelPattern(Level.INFO, pattern);
    }

    public void setWarnPattern(String pattern) {
        setLevelPattern(Level.WARN, pattern);
    }

    public void setErrorPattern(String pattern) {
        setLevelPattern(Level.ERROR, pattern);
    }

    private void setLevelPattern(Level level, String pattern) {
        PatternLayout layout = new PatternLayout();
        layout.setContext(context);
        layout.setPattern(pattern);
        layouts.put(level, layout);
    }

    @Override
    public String doLayout(ILoggingEvent event) {
        PatternLayout matchingLayout = layouts.get(event.getLevel());
        if(matchingLayout != null) {
            return matchingLayout.doLayout(event);
        }
        return layouts.get(null).doLayout(event);
    }

    @Override
    public void start() {
        if(layouts.get(null) == null) {
            throw new RuntimeException("default layout is not initialized, probably no 'defaultPattern' is configured!");
        }
        layouts.values().forEach(layout -> layout.start());
        this.started = true;
    }

    @Override
    public void stop() {
        layouts.values().forEach(layout -> layout.stop());
        this.started = false;
    }

    @Override
    public boolean isStarted() {
        return started;
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM