首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Spring Boot Logback

Java Spring Boot Logback
EN

Stack Overflow用户
提问于 2018-02-09 03:49:20
回答 2查看 615关注 0票数 1

有没有办法在给定特定logging.level的情况下打印不同的logging.pattern

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

代码语言:javascript
复制
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"
EN

回答 2

Stack Overflow用户

发布于 2018-02-09 04:10:53

如果拥有多个附加器是可以接受的,那么对不同级别使用两个不同的附加器将是一种直接的方法,即对ThresholdFilters使用两个不同的附加器。

票数 2
EN

Stack Overflow用户

发布于 2018-02-13 00:45:52

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

但是,您可以有自己的附加器,它根据日志事件的级别以不同的方式格式化日志事件。

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

示例logback.xml:

代码语言:javascript
复制
<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>

测试代码:

代码语言:javascript
复制
public void test() throws Exception{
    log.debug("some debug level log");
    log.info("some info level log");
    log.error("some error level log");
}

输出:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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;
    }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48693650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档