I want to have a diagnostic log that is produced by several tasks managing data. These tasks may be in multiple threads. Each task needs to write an element (possibly with s
Use a logging framework, such as Log4.
and if you are not happy with the output you can write your own Appender, Filter, whatever to tweak it just write. So you could do even some caching to rearrange the entries, although I am not saying this is a good idea.
Use logback-classic. It is a newer and better implementation of log4j.
log4j is and has been the standard for java logging for many years. But if you don't fancy an external dependency then the java.util.logging package provides an acceptable solution.
Use a logging framework that implements some form of the NDC pattern, like Log4J.
I had a similar problem and implementation demands for special logs only. My solution was:
I took a blockinglinkedqueue
with size of *2
of the app's traffic/min.
All threads put the object in the queue and finishes the job.
Separate Log-Writer
thread taking head object from queue and writing it to log4j
file using a separate appender. This appender was not used for systemlogs.
This ensures that logs are written serially and always are in order.
This will not affect performance of the application since log writing is a completely separate process and will not create a bottleneck.
You can also use aysncappender
of log4j
.
You could use synchronization mechanisms (like a monitor or a semaphor) to make sure, that one log request is processed before accepting the next. This could all be hidden from the code calling the logging routines.