2016-03-15 78 views
0

我想在使用logback生成的日志文件上打印标题行。我logback.xml包含以下用于此目的:使用logback在日志文件中打印标题

<appender name="MyFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <File>path/to/logs/MyFile.log</File> 
    <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> 
     <layout class="ch.qos.logback.classic.PatternLayout"> 
     <fileHeader>Some header</fileHeader> 
     <pattern>%d{HH:mm:ss,SSS}:%m%n</pattern> 
     </layout> 
    </encoder> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <fileNamePattern>path/to/logs/MyFile.log.%d{yyyy-MM-dd}.%i</fileNamePattern> 
    </rollingPolicy> 
    </appender> 

时创建,然后头被印在上面新的日志文件所需的,但问题是,如果日志文件已经存在,然后重新启动tomcat的,头是再次打印。我需要在每个日志文件中仅打印一次标题。

我是新的logback。任何帮助将不胜感激。提前致谢。

+0

似乎没有是那样的一个选项(我认为这必须是在RollingFileAppender进行,因为这是检测一个新的需要的地方文件)。Logback允许你插入你自己的appender(例如,通过子类RollingFileAppender),但如果你是新的logback,那么它可能会超越上层。 –

回答

1

您可以创建一个customPatternLayout,扩展ch.qos.logback.classic.PatternLayout,您可以覆盖getFileHeader并检查该标题是否已存在。

下面的代码为我工作:

public class CustomLogPatternLayout extends PatternLayout { 

String filePath; 
String header; 

@Override 
public String getFileHeader() { 
    BufferedReader br; 
    boolean constainsHeader = false; 
    try { 
     br = new BufferedReader(new FileReader(filePath)); 
     String line = br.readLine(); 
     if (line != null) { 
      constainsHeader = true; 
     } 
     br.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    if (constainsHeader) { 
     return null; 
    } else { 
     return header; 
    } 

} 
相关问题