If you build your own custom pattern layout, which it doesn’t sound like you
need to do, your configuration would look like:
<Console name=“Console” target=“SYSTEM_OUT”>
<CustomPatternLayout pattern=“%U%D[%T]”/>
</Console>
If you add your own pattern converters, which is what I think you really want
to do, then you need only include the pattern characters in the pattern string.
I think I have a need for some more flexible converters myself:
1. A converter that can take a boolean expression to test and, if true, will
include the result of the associated pattern in the output. For example
%test{$${mdc:userid} != null:$X{userid}}
2. Enhancement to %X to specify a list of keys instead of a single key -
%X{key1, key2, key3: includeKey=true}. If key1 and key2 were present but not
key 3 the result would be {key1=a, key2=b}. If none of the keys were present
the result would be {}.
Ralph
> On May 18, 2015, at 8:30 AM, Chathura Priyankara <[email protected]>
> wrote:
>
> Hi Gary,
>
> Thanks for the prompt response.
> (For my purpose cannot use Thread context maps because these log information
> are highly user configurable)
> Could you please tell me one thing. If I have custom pattern layout plugin
> eg: (plugin name = CustomPatternLayout).
> How would I configure this for a particular appender using log4j2.xml?
>
> Eg:
>
> <Console name="CONSOLE" target="SYSTEM_OUT">
> <PatternLayout pattern="%U%D[%T]"/>
> </Console>
>
> Here how can I configure console appender to use my CustomPatternLayout ?
>
> Thanks.
>
>
> On Mon, May 18, 2015 at 8:46 PM, Gary Gregory <[email protected]
> <mailto:[email protected]>> wrote:
> Can you achieve the same result with Thread context perhap?
>
> Gary
>
>
> -------- Original message --------
> From: Chathura Priyankara <[email protected]
> <mailto:[email protected]>>
> Date: 05/18/2015 07:40 (GMT-08:00)
> To: Log4J Developers List <[email protected]
> <mailto:[email protected]>>
> Subject: Re: [Dev][log4j2] How to create custom pattern layout in log4j2
>
> Hi Ralph,
>
> There are some custom information that I need to log. Please see the
> following log4j properties.
> log4j.appender.CONSOLE.layout=com.test.custom.PatternLayoutClass
> log4j.appender.CONSOLE.layout.ConversionPattern=[%d] %P%5p {%c} - %x %m%n
> log4j.appender.CONSOLE.layout.CustomPattern=%U%@%D[%T]
>
> Here some custom Conversion characters such as U, D etc. are used. If the
> conversion type is %P
> for ConversionPattern then the log information of CustomPattern will print.
> Can you please tell me how could I do the same thing with log4j2 ?
>
> Thank you very much for the reply.
>
>
> On Mon, May 18, 2015 at 6:25 PM, Ralph Goers <[email protected]
> <mailto:[email protected]>> wrote:
> You shouldn't need to do this. What is different about your layout than what
> comes with Log4j? If you simply have a custom pattern or 2 then you would
> just implement those as converters.
>
> Ralph
>
> On May 18, 2015, at 5:41 AM, Chathura Priyankara <[email protected]
> <mailto:[email protected]>> wrote:
>
>> I have to convert a pattern layout written for log4j 1.2. to log4j2.
>> Following code snippet shows a part of it. I have searched a lot about this
>> but couldn't find a proper guide.
>> Can anyone please give me a brief guide about how to do this conversion ?
>>
>> Any help is highly appreciated!
>>
>> public class CustomPatternLayout extends PatternLayout {
>>
>>
>> public static final String DEFAULT_PATTERN = "[%T][%S]";
>>
>> private static String customPattern = DEFAULT_PATTERN;
>>
>>
>> public CustomPatternLayout(String pattern) {
>> super(pattern);
>> }
>>
>> public synchronized void setCustomPattern(String customPattern) {
>> CustomPatternLayout.customPattern = customPattern;
>> }
>>
>>
>> private static class customPatternParser extends PatternParser {
>>
>> protected void finalizeConverter(char c) {
>> PatternConverter pc = null;
>> switch (c) {
>> case 'P':
>> pc = new UserNamePatternConverter(formattingInfo,
>> extractPrecisionOption());
>> break;
>> .
>> .
>> .
>> default:
>> super.finalizeConverter(c);
>> }
>> if (pc != null) {
>> currentLiteral.setLength(0);
>> addConverter(pc);
>> }
>> }
>>
>> private abstract static class CustomNamedPatternConverter extends
>> PatternConverter {
>>
>> private int precision;
>>
>> public CustomNamedPatternConverter(FormattingInfo formattingInfo,
>> int precision) {
>> super(formattingInfo);
>> this.precision = precision;
>> }
>>
>> protected abstract String getFullyQualifiedName(LoggingEvent event);
>>
>> public String convert(LoggingEvent event) {
>> String n = getFullyQualifiedName(event);
>> if (n == null) {
>> return "";
>> }
>> if (precision <= 0) {
>> return n;
>> } else {
>> int len = n.length();
>> int end = len - 1;
>> for (int i = precision; i > 0; i--) {
>> end = n.lastIndexOf('.', end - 1);
>> if (end == -1) {
>> return n;
>> }
>> }
>> return n.substring(end + 1, len);
>> }
>> }
>> }
>>
>> private static class MyPatternConverter extends
>> CustomNamedPatternConverter {
>>
>> public MyPatternConverter(FormattingInfo formattingInfo, int
>> precision) {
>> super(formattingInfo, precision);
>> }
>>
>> public String getFullyQualifiedName(LoggingEvent event) {
>> int userId = //Get user Id
>> if ( . . .) {
>> return new CustomPatternLayout(customPattern).format(event);
>> }
>> return someOther;
>> }
>> }
>> }
>> }
>> Thanks in advance.
>>
>> --
>> Chathura Priyankara,
>> Faculty of Information Technology,
>> University of Moratuwa.
>> Blog : www.codeoncloud.blogspot.com <http://www.codeoncloud.blogspot.com/>
>
>
>
> --
> Chathura Priyankara,
> Faculty of Information Technology,
> University of Moratuwa.
> Blog : www.codeoncloud.blogspot.com <http://www.codeoncloud.blogspot.com/>
>
>
>
> --
> Chathura Priyankara,
> Faculty of Information Technology,
> University of Moratuwa.
> Blog : www.codeoncloud.blogspot.com <http://www.codeoncloud.blogspot.com/>