[logback-user] Custom appender and layout issue

Adam Gordon adam.n.gordon at gmail.com
Thu Nov 10 00:50:10 CET 2011


That worked.  My custom encoder is doing everything I want and more.  For
some reason, it looks like Logback is calling the doEncode(ILoggingEvent)
twice as the log messages are showing up in duplicate.  I've modified my
XML to use the stock RollingFileAppender and my custom encoder.  Any ideas?
 My encoder is definitely only calling the getFormattedMessage(...) method
and writing it to the output stream once.  Thanks.

--adam

http://gordonizer.com



On Wed, Nov 9, 2011 at 15:17, ceki <ceki at qos.ch> wrote:

>
> You should look at what LayoutWrappingEncoder and try to adapt that for
> your use case. It's just a guess though.
>
> --
> Ceki
> http://twitter.com/#!/ceki
>
>
> On 09.11.2011 22:46, Adam Gordon wrote:
>
>> Ahhhhhh.  Thanks.  I will try that.  Which encoder should I extend -
>> LayoutWrapping or PatternLayout?  I noticed that OutputStreamAppenders
>> use LayoutWrappingEncoder.  Or should I roll my own from scratch?
>>
>> --adam
>>
>> http://gordonizer.com
>>
>>
>>
>> On Wed, Nov 9, 2011 at 13:51, ceki <ceki at qos.ch <mailto:ceki at qos.ch>>
>> wrote:
>>
>>
>>    Although very similar to log4j, logback is different in certain
>>    aspects. In particular, logback's OutputStreamAppedner and derived
>>    classes (ConsoleAppnder, FileAppender and RollingFileAppender) use
>>    an Encoder [1] to write to the output stream. From the looks of it,
>>    you should probably write your own encoder.
>>
>>    HTH,
>>
>>    [1]
>>    http://logback.qos.ch/apidocs/**__ch/qos/logback/core/encoder/**
>> __Encoder.html<http://logback.qos.ch/apidocs/__ch/qos/logback/core/encoder/__Encoder.html>
>>
>>    <http://logback.qos.ch/**apidocs/ch/qos/logback/core/**
>> encoder/Encoder.html<http://logback.qos.ch/apidocs/ch/qos/logback/core/encoder/Encoder.html>
>> >
>>
>>
>>    On 09.11.2011 21:29, Adam Gordon wrote:
>>
>>        I'm trying to port my log4j appender and layout over to logback
>>        but am
>>        running into some issues.  My log4j appender colorizes the
>> timestamp
>>        printed in the logs and the layout colorizes the log messages
>>        based on
>>        level - at least, in theory.
>>
>>        I think I've correctly configured everything in the XML but my
>>        classes
>>        are not quite correct.  I'm getting the colored timestamp and I'm
>>        partially getting the colorized log messages, but am not getting
>> the
>>        pattern I've specified in my XML and the log messages are all
>>        smushed
>>        together back to back.  I suspect I'm not overriding the right
>>        methods
>>        or not calling them in the right order or place.
>>
>>        Here's my appender XML:
>>
>>        <appender name="foouilog"
>>        class="com.foo.logging.__**FooRollingFileAppender">
>>        <file>/usr/local/tomcat/logs/_**_fooui.log</file>
>>        <rollingPolicy
>>        class="ch.qos.logback.core.__**rolling.__**
>> TimeBasedRollingPolicy">
>>        <!-- rollover daily -->
>>        <fileNamePattern>/usr/local/__**tomcat/logs/fooui-%d{yyyy-MM-_**
>> _dd}.%i.gz</fileNamePattern>
>>        <maxHistory>10</maxHistory>
>>        <__**timeBasedFileNamingAndTriggeri**__ngPolicy
>>
>>          class="ch.qos.logback.core.__**rolling.SizeAndTimeBasedFNATP"**
>> __>
>>        <maxFileSize>25MB</__**maxFileSize>
>>        </__**timeBasedFileNamingAndTriggeri**__ngPolicy>
>>        </rollingPolicy>
>>        <encoder
>>        class="ch.qos.logback.core.__**encoder.LayoutWrappingEncoder"**__>
>>        <layout class="com.foo.logging.__**AnsiColorLayout"/>
>>
>>        <pattern>%date{ISO8601} %p [%logger{5}.%method:%line] -
>>        %msg%n%rEx</pattern>
>>        </encoder>
>>        </appender>
>>
>>        And here's the relevant Java code:
>>
>>        Appender:
>>
>>           public class FooRollingFileAppender extends
>>        RollingFileAppender<__**ILoggingEvent> {
>>
>>             *** snip ***
>>             public void append(ILoggingEvent eventObject) {
>>               OutputStream os = this.getOutputStream();
>>               // code to write out color formatted timestamp
>>               os.flush();
>>
>>               super.append(eventObject);
>>             }
>>             *** snip ***
>>           }
>>
>>        Layout:
>>
>>           public class AnsiColorLayout extends LayoutBase<ILoggingEvent> {
>>
>>             *** snip ***
>>
>>             public String doLayout(ILoggingEvent event) {
>>               return this.format(event);
>>             }
>>
>>             private String format(ILoggingEvent event) {
>>               StringBuilder sb = new StringBuilder();
>>               switch (event.getLevel().toInt()) {
>>
>>                 *** snip ***
>>
>>               }
>>               sb.append(event.__**getFormattedMessage());
>>
>>               sb.append(COLOR_DEFAULT);
>>               return sb.toString();
>>             }
>>
>>             *** snip ***
>>           }
>>
>>        Thanks,
>>
>>        --adam
>>
>>        http://gordonizer.com
>>
>>
>>  ______________________________**_________________
> Logback-user mailing list
> Logback-user at qos.ch
> http://mailman.qos.ch/mailman/**listinfo/logback-user<http://mailman.qos.ch/mailman/listinfo/logback-user>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.qos.ch/pipermail/logback-user/attachments/20111109/3d4a2044/attachment-0001.html>


More information about the Logback-user mailing list