2013-01-05 6 views
7

Próbuję utworzyć niestandardowy układ w logback jak pokazano na przykład w chapter 6 in the manual:Tworzenie niestandardowy układ w 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(); 
} 

Potem skonfigurowany plik XML w następujący sposób:

<?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> 

Jednak podczas próby utworzenia programu rejestrującego pojawia się następujący błąd:

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

Tutaj jest er ror wiadomość, że mam:

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. 

Odpowiedz

14

Domyślna enkoder jest PatternLayoutEncoder który jest podklasą PatternLayoutEncoderBase. PatternLayoutEncoderBase obsługuje tylko ustawienie wzór dziennika:

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

Można użyć LayoutWrappingEncoder zamiast

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