I have a web page, used for admin purposes, which runs a task (image fetching from a remote site).
In order to be able to debug the task using the browser only, no ssh etc, I'd like to be able to read all log output from the executing thread and spit it out to the web page.
The task boils down to:
- Changing log level for current thread at the beginning of the call and restore when the call is done.
- Reading all log output by current thread and storing it in a string.
So in pseudocode my execute() method would look like this: (I'm using struts2)
public String execute() throws Exception {
turnLoggingLevelToDebugOnlyForThisThread()
... do stuff...
restoreLoggingLevelForThisThread()
String logs = readAllLogsByThisThread();
}
Can this be done with log4j?
I'm using tomcat, struts2, log4j and slf4j.
EDIT 1: I should note that the motivation is to be able to see the existing logs on a web page without needing to add new log lines in code. Think of a nice web debug interface that lets you run your operation and the result spits out the logs of the operation.
EDIT 2: I should also note that I'm already using log4j (via slf4j) and a log4j.xml, so the solution I'm seeking needs to live aside the currently logging system, not ruin it.
You can create a log4j appender to write to a StringWriter. Here is an example I did some time ago:
It writes all ERROR logs to the consoleWriter, but you can set the scope or the level of the logs as you wish. The scope (logger name) should be a unique identifier of the thread. something like this:
Your thread should write to this logger.
And when you want to finish logging the thread:
UPDATE: Here is a working example. Writes error logs to a file (set in log4j.xml) + writes all thread logs to a StringWriter, when enabled:
And here is my log4j.xml: