<font size="2"><font face="tahoma,sans-serif">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.<br clear="all">

</font></font><br>--adam<br><br><a href="http://gordonizer.com" target="_blank">http://gordonizer.com</a><br><br>
<br><br><div class="gmail_quote">On Wed, Nov 9, 2011 at 15:17, ceki <span dir="ltr"><<a href="mailto:ceki@qos.ch">ceki@qos.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

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