Logback configuration on tomcat

java, logback, tomcat

Solution

Logback-access is for access logs. Logback-access has different intent than logback-classic. Thus, in a logback-access configuration file you need to use `PatternLayoutEncoder` from the "ch.qos.logback.access" package not "ch.qos.logback.classic.encoder" package.

For example, write:

<appender name="RootConsoleAppender" class="ch.qos.logback.core.ConsoleAppender">
  <encoder class="ch.qos.logback.access.PatternLayoutEncoder">
    <pattern>%clientHost %l %user %date "%r" %statusCode %bytesSent</pattern>
  </encoder>
</appender>

Please also refer to list conversion words available for logback-access PatternLayout.

Problem

I am using Logback on tomcat (7.0.37). I want to config logback in which it can write web-accessible log files for me but i can even config it to write on console. I cannot format the log message on the console. It always return me with the default format and an exception. `%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n` Here are my logback-access.xml: ``` <?xml version="1.0" encoding="UTF-8"?> <configuration debug="true"> <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> <appender name="RootFileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>testing</file> <append>true</append> <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> <fileNamePattern>testing.%i</fileNamePattern> <minIndex>1</minIndex> <maxIndex>12</maxIndex> </rollingPolicy> <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> <maxFileSize>1MB</maxFileSize> </triggeringPolicy> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%d{yyyy-MM-dd HH:mm:ss} %m%n</pattern> </layout> </encoder> </appender> <appender name="RootConsoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss} %-6level- %logger{36}: %msg%n</pattern> </encoder> </appender> <appender-ref ref="RootFileAppender"/> <appender-ref ref="RootConsoleAppender"/> </configuration> ``` With this config, i get exception every time when there are http request to my server as below: ``` 18:08:19,951 |-ERROR in ch.qos.logback.core.ConsoleAppender[RootConsoleAppender] - Appender [RootConsoleAppender] failed to append. java.lang.ClassCastException: ch.qos.logback.access.spi.AccessEvent cannot be cast to ch.qos.logback.classic.spi.ILoggingEvent at java.lang.ClassCastException: ch.qos.logback.access.spi.AccessEvent cannot be cast to ch.qos.logback.classic.spi.ILoggingEvent at at ch.qos.logback.classic.PatternLayout.doLayout(PatternLayout.java:60) at at ch.qos.logback.core.encoder.LayoutWrappingEncoder.doEncode(LayoutWrappingEncoder.java:134) at at ch.qos.logback.core.OutputStreamAppender.writeOut(OutputStreamAppender.java:188) at at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:212) at at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:103) at at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:88) at at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:48) at at ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:182) at at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) at at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) at at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) at at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) at at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) at at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) at at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at at java.lang.Thread.run(Thread.java:722) ```

Original source