SWEET!

thanks Ceki. My guess is other people will want to do the same thing. bellow is 
my working code. 

background. I have a CLI java application. I want to generate all output using 
logger instead of System.out or System.error. I want logger.info() to be un 
decorated. All other levels of logging should level, class and line #

Thanks


Andy

public class DebugConverter extends CompositeConverter<ILoggingEvent> {

    public DebugConverter() {
        // TODO Auto-generated constructor stub
    }

    @Override
    protected String transform(ILoggingEvent event, String in) {
        if (Level.INFO == event.getLevel()) {
            return "";
        }
        StringBuilder sb = new StringBuilder();
        sb.append(in);
        String ret =  sb.toString();
        return ret;
    }
}

<configuration>
        <conversionRule conversionWord="AST_DEBUG" 
                  
converterClass="com.apple.ast.logging.converter.DebugConverter" />
                  
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%AST_DEBUG(%-5level [%class{16}] [line:%L]) %m%n</pattern>
        </encoder>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
    </root>
</configuration>

    @Test
    public void testLogger() {
        logger.debug("debug {}", "testLogger");
        logger.info("info {}", "testLogger");
        logger.warn("warn {}", "testLogger");
        logger.error("error {}", "testLogger");
    }


generates following output

DEBUG [c.a.a.CustomDelimitedFileSourceTest] [line:120] debug testLogger
 info testLogger
WARN  [c.a.a.CustomDelimitedFileSourceTest] [line:122] warn testLogger
ERROR [c.a.a.CustomDelimitedFileSourceTest] [line:123] error testLogger



> On Apr 15, 2015, at 3:23 AM, Ceki Gülcü <[email protected]> wrote:
> 
> Hi Andy,
> 
> When you write "%a(%x %y)" then %x and %y are child converters for %a. So, in 
> the case of "%debug(%level %d %t)", the converters %level,%d and %t are 
> children of %debug. %debug is said to be a composite converter and the 
> parenthesis () is sort of a composition operator.
> 
> For your particular case, you need to sub-class CompositeConverter. See the 
> implementation for HighlightingCompositeConverter (and 
> ForegroundCompositeConverterBase). Look at the code for CompositeConverter ND 
> notice how the convert() method of CompositeConverter delegates to child 
> converters and only at the end transforms the results.
> 
> I hope this helps,
> 
> --
> Ceki
> 
> On 4/15/2015 3:12, Andrew E. Davidson wrote:
>> Hi Ceki
>> 
>> 
>>> 
>>> Alternatively, you could write a custom conversion specifier. If you
>>> had a specifier called %debug which output contents only for level
>>> DEBUG, and a %warn specifier which output contents only for level WARN
>>> and another specifier %ERROR which output contents for ERROR, your
>>> pattern could be written as
>>> 
>>> %debug(%level %d %t) %error(%level) %info(%level) %m%n
>>> 
>>> See http://logback.qos.ch/manual/layouts.html#customConversionSpecifier
>>> for documentation on this topic.
>>> 
>> 
>> I tried your “custom conversion specifier” approach. I think I am
>> missing something. In your logback.xml it looks like you are able to
>> pass arguments. I used a debugger how ever it did not appear like the
>> the ILoggingEvent had anything particularly useful other then the level
>> and thread Name values. List<String> optionList= getOptionList(); gives
>> me [%level %d %t] how ever the values have not been expanded
>> 
>> Your solution is very close to what I want to do.
>> 
>> Thanks in advance
>> 
>> Andy
>> 
>> public class DebugConverter extends ClassicConverter {
>> public DebugConverter() {
>> // TODO Auto-generated constructor stub
>>     }
>> 
>> @Override
>> public String convert(ILoggingEvent event) {
>> List<String> optionList = getOptionList();
>> Levellevel=event.getLevel();
>>         System.err.println("convert() level:" + level);
>> return"DebugConverter.convert()";
>>     }
>> }
>> 
>> <configuration>
>> <conversionRuleconversionWord="AST_DEBUG"
>> converterClass="com.apple.ast.logging.converter.DebugConverter"/>
>> 
>> 
>> <appendername="STDOUT"class="ch.qos.logback.core.ConsoleAppender">
>> <encoder>
>> <!--
>>             <pattern>%-5level %date{HH:mm:ss,SSS} [%thread]
>> [%class{16}] [line:%L] %msg%n</pattern>
>>             -->
>> <pattern>%AST_DEBUG{%level %d %t}  %m%n</pattern>
>> </encoder>
>> </appender>
>> 
>> <rootlevel="DEBUG">
>> <appender-refref="STDOUT"/>
>> </root>
>> </configuration>
> _______________________________________________
> Logback-user mailing list
> [email protected]
> http://mailman.qos.ch/mailman/listinfo/logback-user

_______________________________________________
Logback-user mailing list
[email protected]
http://mailman.qos.ch/mailman/listinfo/logback-user

Reply via email to