У меня есть веб-страница, используемая в администраторских целях, который выполняет задачу (выборка изображения от удаленного сайта).
Чтобы смочь отладить задачу с помощью браузера только, никакой ssh и т.д., я хотел бы смочь считать весь вывод журнала из выполняющегося потока и выложить его к веб-странице.
Задача сводится к:
Таким образом в псевдокоде мой выполняющийся () метод был бы похож на это: (Я использую struts2),
public String execute() throws Exception {
turnLoggingLevelToDebugOnlyForThisThread()
... do stuff...
restoreLoggingLevelForThisThread()
String logs = readAllLogsByThisThread();
}
Это может быть сделано с log4j?
Я использую кота, struts2, log4j и slf4j.
РЕДАКТИРОВАНИЕ 1: Я должен отметить, что мотивация должна смочь видеть существующий вход в систему веб-страница, не будучи должен добавить новые строки журнала в коде. Думайте о хорошем веб-интерфейсе отладки, который позволяет Вам выполнить свою операцию, и результат выкладывает журналы операции.
РЕДАКТИРОВАНИЕ 2: Я должен также отметить, что уже использую log4j (через slf4j) и log4j.xml, таким образом, решение, я ищу потребности жить в стороне в настоящее время система регистрации, не разрушают его.
Вы можете создать приложение log4j для записи в StringWriter. Вот пример, который я сделал некоторое время назад:
consoleWriter = new StringWriter();
WriterAppender appender = new WriterAppender(new PatternLayout("%d{ISO8601} %p - %m%n"),consoleWriter);
appender.setName("CONSOLE_APPENDER");
appender.setThreshold(org.apache.log4j.Level.ERROR);
Logger.getRootLogger().addAppender(appender);
Он записывает все журналы ERROR в consoleWriter, но вы можете установить область или уровень журналов по своему усмотрению. Область видимости (имя регистратора) должна быть уникальным идентификатором потока. что-то вроде этого:
Logger.getLogger("Thread-00001").addAppender(appender);
Ваш поток должен писать в этот регистратор.
Logger.getLogger("Thread-00001").info("blah blah blah");
И когда вы хотите завершить регистрацию потока:
Logger.getLogger("Thread-00001").removeAppender("CONSOLE_APPENDER");
ОБНОВЛЕНИЕ: Вот рабочий пример. Записывает журналы ошибок в файл (установлен в log4j.xml) + записывает журналы всех потоков в StringWriter, если он включен:
import java.io.StringWriter;
import org.apache.log4j.Logger;
import org.apache.log4j.Level;
import org.apache.log4j.WriterAppender;
import org.apache.log4j.PatternLayout;
public class Log4jTest implements Runnable {
public static final String CONSOLE_APPENDER = "CONSOLE_APPENDER";
private static WriterAppender appender = null;
private static int counter = 1;
public static synchronized String getNextId() {
return "Thread_00"+(counter++);
}
public void run() {
String id="UNKNOWN";
try {
id = getNextId();
Logger log = Logger.getLogger(id);
log.addAppender(appender);
log.setLevel(Level.DEBUG);
log.info(id+" log message 1");
log.removeAppender(CONSOLE_APPENDER);
log.info(id+" log message 2");
log.error(id+" log message 3");
} catch (Exception e) {
System.out.println("Error in "+id);
e.printStackTrace();
}
}
public static void main(String [] args) {
try {
StringWriter consoleWriter = new StringWriter();
appender = new WriterAppender(new PatternLayout("%d{ISO8601} %p - %m%n"),consoleWriter);
appender.setName(CONSOLE_APPENDER);
appender.setThreshold(org.apache.log4j.Level.DEBUG);
for (int i=0; i<5; i++) {
Thread t = new Thread(new Log4jTest());
t.start();
}
Thread.sleep(200);
System.out.println(consoleWriter.getBuffer().toString());
} catch (Exception e) {
e.printStackTrace();
}
}
}
А вот мой log4j.xml:
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="FILE" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="./Log4jTest.log" />
<param name="MaxFileSize" value="1000KB" />
<param name="MaxBackupIndex" value="5" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{ISO8601} %p - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" />
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<root>
<level value="ERROR" />
<appender-ref ref="FILE" />
</root>
</log4j:configuration>