gpt4 book ai didi

java - 如何读取 log4j 输出到网页?

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:26 24 4
gpt4 key购买 nike

我有一个网页,用于管理目的,它运行一个任务(从远程站点获取图像)。
为了能够仅使用浏览器而不使用 ssh 等来调试任务,我希望能够从执行线程读取所有日志输出并将其输出到网页。
任务归结为:

  1. 在调用开始时更改当前线程的日志级别,并在调用完成后恢复。
  2. 读取当前线程输出的所有日志并将其存储在一个字符串中。

所以在伪代码中我的 execute() 方法看起来像这样:(我正在使用 struts2)

public String execute() throws Exception {
turnLoggingLevelToDebugOnlyForThisThread()
... do stuff...
restoreLoggingLevelForThisThread()
String logs = readAllLogsByThisThread();
}

这可以用 log4j 完成吗?

我正在使用 tomcat、struts2、log4j 和 slf4j。

编辑 1:我应该指出,动机是能够在网页上查看现有日志,而无需在代码中添加新的日志行。想一个不错的 Web 调试界面,它可以让您运行您的操作,结果会吐出操作日志。
编辑 2:我还应该注意,我已经在使用 log4j(通过 slf4j)和 log4j.xml,所以我寻求的解决方案需要保留当前的日志系统,而不是破坏它。

最佳答案

您可以创建一个 log4j appender 来写入 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>

关于java - 如何读取 log4j 输出到网页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2555865/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com