[英]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.