java 在 Logback 中创建自定义布局
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14168684/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Creating a custom layout in Logback
提问by TeFa
I am trying to create a custom layout in logback as shown in an example in chapter 6 in the manual:
我正在尝试在 logback 中创建自定义布局,如手册第 6 章中的示例所示:
package com.dces.util;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.CoreConstants;
import ch.qos.logback.core.LayoutBase;
public class LoggingConsoleLayout extends LayoutBase<ILoggingEvent>{
@Override
public String doLayout(ILoggingEvent event) {
StringBuffer sbuf = new StringBuffer(128);
sbuf.append("-- ");
sbuf.append("[");
sbuf.append(event.getLevel());
sbuf.append("]");
sbuf.append(event.getLoggerName());
sbuf.append(" - ");
sbuf.append(event.getFormattedMessage().replaceAll("\n", "\n\t"));
sbuf.append(CoreConstants.LINE_SEPARATOR);
return sbuf.toString();
}
Then I configured the XML file as follows:
然后我配置了 XML 文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- <pattern> %-5level [%logger{0}] - %msg%n </pattern> -->
<layout class="com.dces.util.LoggingConsoleLayout" />
</encoder>
</appender>
<root level="trace">
<appender-ref ref="STDOUT" />
</root>
</configuration>
However, I get the following error when I try to create a logger as following:
但是,当我尝试按如下方式创建记录器时出现以下错误:
public class Main {
private static Logger logger = (Logger)LoggerFactory.getLogger(Main.class);
public static void main(String [] args)
{
logger.info("Testing");
}
}
Here is the error message that I get:
这是我收到的错误消息:
05:40:11,519 |-ERROR in ch.qos.logback.core.joran.util.PropertySetter@3462fc6c - Could not invoke method setLayout in class ch.qos.logback.classic.encoder.PatternLayoutEncoder with parameter of type com.dces.util.LoggingConsoleLayout java.lang.reflect.InvocationTargetException
at java.lang.reflect.InvocationTargetException
at at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at at java.lang.reflect.Method.invoke(Unknown Source)
at at ch.qos.logback.core.joran.util.PropertySetter.invokeMethodWithSingleParameterOnThisObject(PropertySetter.java:293)
at at ch.qos.logback.core.joran.util.PropertySetter.setComplexProperty(PropertySetter.java:356)
at at ch.qos.logback.core.joran.action.NestedComplexPropertyIA.end(NestedComplexPropertyIA.java:179)
at at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:318)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:197)
at at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:183)
at at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:157)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:143)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:106)
at at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:56)
at at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:75)
at at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:148)
at at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:85)
at at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
at at org.slf4j.LoggerFactory.bind(LoggerFactory.java:128)
at at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:107)
at at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:295)
at at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:269)
at at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:281)
at at com.dces.Main.<clinit>(Main.java:8)
Caused by: java.lang.UnsupportedOperationException: one cannot set the layout of ch.qos.logback.classic.encoder.PatternLayoutEncoder
at at ch.qos.logback.core.pattern.PatternLayoutEncoderBase.setLayout(PatternLayoutEncoderBase.java:64)
at ... 25 common frames omitted
05:40:11,538 |-ERROR in ch.qos.logback.classic.PatternLayout("null") - Empty or null pattern.
回答by Jintian DENG
The default encoder is PatternLayoutEncoder which is a subclass of PatternLayoutEncoderBase. PatternLayoutEncoderBase only supports setting a log pattern such as:
默认编码器是 PatternLayoutEncoder,它是 PatternLayoutEncoderBase 的子类。PatternLayoutEncoderBase 仅支持设置日志模式,例如:
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
You can use LayoutWrappingEncoder instead
您可以改用 LayoutWrappingEncoder
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="com.dces.util.LoggingConsoleLayout" />
</encoder>