2013-01-05 69 views
7

我試圖創建的logback自定義佈局創建自定義佈局,如圖中的實施例chapter 6 in the manual中的logback

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(); 
} 

然後我配置的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> 

但是,當我嘗試創建一個記錄器時出現以下錯誤,如下所示:

public class Main { 
    private static Logger logger = (Logger)LoggerFactory.getLogger(Main.class); 
    public static void main(String [] args) 
    { 
     logger.info("Testing"); 
    } 
} 

這裏是呃ror消息,我得到:

05:40:11,519 |-ERROR in [email protected] - 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. 

回答

14

默認編碼器是PatternLayoutEncoder,它是PatternLayoutEncoderBase的子類。 PatternLayoutEncoderBase只支持設置日誌模式:

<encoder> 
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
<encoder> 

您可以使用LayoutWrappingEncoder代替

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> 
     <layout class="com.dces.util.LoggingConsoleLayout" /> 
    </encoder>