2015-09-10 129 views
1

当前logback.xml如何在java logback中打印自定义堆栈跟踪?

<appender name="FILEOUT3" class="ch.qos.logback.core.FileAppender"> 
    <file>D:/${byDay}.log</file> 
    <append>true</append> 
    <encoder> 
     <Pattern>%d{HH:mm:ss} %-5level %msg%replace(%xException){"\n", ">> "}%nopex%n</Pattern> 
    </encoder> 
</appender> 

当前的结果:

 
play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]] 
>> at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:92) ~[play_2.10-2.2.0.jar:2.2.0] 
>> at play.api.Configuration.reportError(Configuration.scala:570) ~[play_2.10-2.2.0.jar:2.2.0] 
>> at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:252) ~[play-jdbc_2.10-2.2.0.jar:2.2.0] 

我想结果是:

 
[12:43:16.454] play.api.Configuration$$anon$1: Configuration error[Cannot connect to database [default]] 
[12:43:16.454] at play.api.Configuration$.play$api$Configuration$$configError(Configuration.scala:92) ~[play_2.10-2.2.0.jar:2.2.0] 
[12:43:16.454] at play.api.Configuration.reportError(Configuration.scala:570) ~[play_2.10-2.2.0.jar:2.2.0] 
[12:43:16.454] at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:252) ~[play-jdbc_2.10-2.2.0.jar:2.2.0] 
: 
: 
more 40 lines 
: 
[12:43:16.454] at play.api.db.BoneCPPlugin$$anonfun$onStart$1.apply(DB.scala:252) ~[play-jdbc_2.10-2.2.0.jar:2.2.0] 

重要!
同时打印

我想知道的。
如何更改logback.xml?

回答

2

您不能通过仅更改logback.xml来实现此目的,因为由%replace调用的ReplacingCompositeConverter仅使用静态字符串作为替换(无日期或PatternLayout的任何其他转换字)。

为了达到你的目标,你应该创建自定义转换器(如果你用我的注意,它应该被放置在ch.qos.logback.core.pattern包)

package ch.qos.logback.core.pattern; 

import ch.qos.logback.classic.PatternLayout; 

import ch.qos.logback.core.pattern.parser.Node; 
import ch.qos.logback.core.pattern.parser.Parser; 
import ch.qos.logback.core.spi.ScanException; 

public class ReplacingAndParsingCompositeConverter<E> extends ReplacingCompositeConverter<E> { 

    @Override 
    protected String transform(E event, String in) { 
     if (!started) { 
      return in; 
     } 

     String parsedReplacement; 

     try { 
      Parser<E> p = new Parser<E>(replacement); 
      p.setContext(getContext()); 
      Node t = p.parse(); 
      Converter<E> c = p.compile(t, PatternLayout.defaultConverterMap); 
      ConverterUtil.setContextForConverters(getContext(), c); 
      ConverterUtil.startConverters(c); 
      StringBuilder buf = new StringBuilder(); 
      while (c != null) { 
       c.write(buf, event); 
       c = c.getNext(); 
      } 
      parsedReplacement = buf.toString(); 
     } catch (ScanException e) { 
      e.printStackTrace(); 
      parsedReplacement = replacement; 
     } 
     return pattern.matcher(in).replaceAll(parsedReplacement); 
    } 
} 

那么你应该申报此转换器在logback.xml中使用< conversionRule/>并使用它替代旧的%替换。

<configuration ...> 
    <conversionRule conversionWord="replaceAndParse" converterClass="ch.qos.logback.core.pattern.ReplacingAndParsingCompositeConverter" /> 

    <appender name="FILEOUT3" class="ch.qos.logback.core.FileAppender"> 
     <file>D:/${byDay}.log</file> 
     <append>true</append> 
     <encoder> 
      <Pattern>[%d{HH:mm:ss.SSS}] %-5level %msg%replaceAndParse(%xException){"(\r?\n)", "$1[%d{HH:mm:ss.SSS}]"}%nopex%n</Pattern> 
     </encoder> 
    </appender> 
    .... 
</configuration> 
+0

谢谢!你能把简单的代码发给我吗? [email protected] /我很抱歉。我的英语不太好。 –

+0

更换/模式错误:(如何修复源代码? –

+0

您能澄清您的评论吗?我不确定我是否关注您 –