I have a Struts application with log4j to display information about application.
The pattern to format log's output is as follows:
log4j.appender.RALL.layout.ConversionPattern=[%p] %d{dd/MM/yyyy HH:mm:ss} [THREAD ID=%t] [CLASS=(%C{1}:%L)] %m%n
I need to show the thread id instead the thread name in log. The conversion character that display the thread name is %t. I don't see in log4j documentation the way to get it.
Can anyone help me??
get_ident() function. In Python 3.3+, you can use threading. get_ident() function to obtain the thread ID of a thread.
The getId() method of Thread class returns the identifier of the invoked thread. The thread ID is a positive long number generated when this thread was created. The thread ID is unique and remains unchanged during its lifetime.
currentThread() is a static method , returns a reference to the currently executing thread object. After getting the reference of the current thread , we will call the getId() method on Thread class. getId() method in Java. getId() will return the unique identifier of current thread which is a positive long value.
There is the way of current thread getting: Thread t = Thread. currentThread(); After you have got Thread class object (t) you are able to get information you need using Thread class methods.
It is possible but not so easy as just using some preconfigured patterns.
Log4j 1.X and Log4j 2.x don't have any preconfigured patterns for printing Thread ID but you can always use some "magic trick".
PatternLayout
is using PatternParser
class which is mark as final
class and has static map of "patterns" as keys and Converters
classes as values. Everytime when Parses finds pattern using for logging pattern format starting with %
it uses converter matched with this pattern key in map.
You cannot add your own rule to that map, but you can still write your own MyOwnPatternLayout:
public class MyOwnPatternLayout extends PatternLayout
which will in it's format
method do such trick:
public String format(LoggingEvent event) { String log = super.format(event); /* Now you just have to replace with regex all occurences of %i or any mark you would like to use as mark to represent Thread ID with Thread ID value. Only thing you have to be sure to not use any mark as your Thread ID that already is defined by PatterParser class */ return log.replaceAll("%i", someThreadID); }
The only problem is that you have to get that thread ID in some way. Sometimes all you have to do is to parse Thread name which can you easily collect:
String threadName = event.getThreadName();
For example Apache-Tomcat put thread ID at the end of thread name http-nio-/127.0.0.1-8084"-exec-41.
To be sure that thread ID is correct you can also make your own subclass of LogginEvent and Logger (MyLoggingEvent and MyLogger) and inside MyLogger create MyLoggingEvent witch will also take as argument Thread ID not only Thread Name. Then you can easly collect it in code above.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With