How to conditionally add text from MDC on a LOG4J

2019-04-28 19:22发布

问题:

How do I print a key/value pair on a log4j entry only if the value is set on MDC?

For example, I currently have the following pattern:

%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - client=%X{client} %m%n

I'd like to print the "client=" part only if there is a value on MDC for this key.

For example, when starting my program, there will be no client logged in, so logs would be recorded using this pattern:

%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

However, after the client has logged in (and after I have set the MDC with a "client" key), I need to print it using the following:

%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - client=%X{client} %m%n

Is there such "conditional pattern" on log4j?

Thank you

回答1:

There is a %notEmpty pattern in Log4j2 which allows you to achieve exactly this.

%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %notEmpty{client=%X{client} }%m%n


回答2:

I endend up using xav's suggestion.

I removed the "client=" string from the log4j pattern and appended it everytime I added an entry to MDC. It's not the most beautiful solution but it worked great!

For example, where I otherwise would use

MDC.put("client", client.getId());

I am now using:

MDC.put("client", "client="+client.getId().toString());


标签: log4j