如何使用log4j捕获第三方控制台日志(How to catch third party console log using log4j)

编程入门 行业动态 更新时间:2024-10-25 00:31:03
如何使用log4j捕获第三方控制台日志(How to catch third party console log using log4j)

我正在使用log4j在我的应用程序中记录操作。 我使用以下文件appender:

private FileAppender getFileAppender(String name) { PatternLayout layout = new PatternLayout("%d{ABSOLUTE} %5p %t %c{1}:%M:%L - %m%n"); StringBuilder filePath = new StringBuilder(); filePath.append("logs/") .append(name) .append(".log"); FileAppender fileAppender = null; try { File file = new File(filePath.toString()); file.getParentFile().mkdirs(); file.createNewFile(); fileAppender = new FileAppender(layout, filePath.toString(), true); fileAppender.setName("FileAppender"); fileAppender.setAppend(true); } catch (IOException e) { LogWrapper.LOG.get(this.getClass().getSimpleName()).trace(e); } return fileAppender; }

我的应用程序使用第三方,将Web服务调用记录到控制台。 然后,我运行应用程序,在Intellij Idea的控制台中看到这些日志,但不在生成的日志文件中。

如何将这些日志重定向到File Appender生成的文件中?

更新答案是正确的,但是还有一个第三方使用了Console Appender的logback,属性如下所示:

<configuration status="OFF"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <root level="WARN"> <appender-ref ref="STDOUT" /> </root>

因为这个捕获控制台输出堆栈。 我如何捕获并重新编写Logback属性并使其登录到文件或禁用日志?

I'm using log4j for logging actions in my application. I use following file appender:

private FileAppender getFileAppender(String name) { PatternLayout layout = new PatternLayout("%d{ABSOLUTE} %5p %t %c{1}:%M:%L - %m%n"); StringBuilder filePath = new StringBuilder(); filePath.append("logs/") .append(name) .append(".log"); FileAppender fileAppender = null; try { File file = new File(filePath.toString()); file.getParentFile().mkdirs(); file.createNewFile(); fileAppender = new FileAppender(layout, filePath.toString(), true); fileAppender.setName("FileAppender"); fileAppender.setAppend(true); } catch (IOException e) { LogWrapper.LOG.get(this.getClass().getSimpleName()).trace(e); } return fileAppender; }

My application uses third party, what logs web services calls into console. Then I run application I see those logs in my console in Intellij Idea, but not on the generated log file.

How to redirect those logs into the file, generated by File Appender?

Update The answer is correct, but there is one more third party what use logback with Console Appender, properties looks like:

<configuration status="OFF"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <root level="WARN"> <appender-ref ref="STDOUT" /> </root>

Because of this catching console output stacks. How could I catch and re-write Logback properties and make it log to file or disable logs at all?

最满意答案

您可以尝试这样将STDOUT记录为INFO和STDERR,例如警告:

final Logger myLog4jLogger = Logger.getLogger(getClass()); System.setOut(new PrintStream(new ByteArrayOutputStream() { @Override public synchronized void write(byte[] pB, int pOff, int pLen) { super.write(pB, pOff, pLen); myLog4jLogger.info(toString()); reset(); } })); System.setErr(new PrintStream(new ByteArrayOutputStream() { @Override public synchronized void write(byte[] pB, int pOff, int pLen) { super.write(pB, pOff, pLen); myLog4jLogger.warn(toString()); reset(); } }));

在Log4j初始化之后和调用第三方工具之前,只做一次。 请注意,这意味着您的进程的STDOUT和STDERR将被重定向到您的日志,因此您的进程发送到STDOUT / STDERR的所有文本都将转到日志,包括您自己的"System.out.println()" 。

另外,使用这个,你可能想避免记录到控制台,因为我不确定如果你登录到控制台会发生什么,并且控制台被重定向到日志......(无尽循环?堆栈溢出?OutOfMemoryError ?)

关于使用Logback的第三方,您可以将其日志发送到文件而不是STDOUT,方法是将其添加到其配置文件中:

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>myApp.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>

并通过替换:

<appender-ref ref="STDOUT" />

...有:

<appender-ref ref="FILE" />

You can try this to log STDOUT as INFO and STDERR as WARNING for example:

final Logger myLog4jLogger = Logger.getLogger(getClass()); System.setOut(new PrintStream(new ByteArrayOutputStream() { @Override public synchronized void write(byte[] pB, int pOff, int pLen) { super.write(pB, pOff, pLen); myLog4jLogger.info(toString()); reset(); } })); System.setErr(new PrintStream(new ByteArrayOutputStream() { @Override public synchronized void write(byte[] pB, int pOff, int pLen) { super.write(pB, pOff, pLen); myLog4jLogger.warn(toString()); reset(); } }));

Do this only once after Log4j initialization and before calling your third party tool. Be careful, it means that the STDOUT and STDERR of your process will be redirected to your logs, so all the text sent to STDOUT/STDERR by your process will go to logs, including your own "System.out.println()".

Also, using this, you may want to avoid logging to the console, because I'm not sure what will happen if you log to the console and that the console is redirected to the logs... (endless loop? stack overflow? OutOfMemoryError?)

Concerning the third party that uses Logback, you can send its logs to a file instead of STDOUT by adding this to its config file:

<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>myApp.log</file> <encoder> <pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>

And by replacing:

<appender-ref ref="STDOUT" />

...with:

<appender-ref ref="FILE" />

更多推荐

本文发布于:2023-07-07 21:46:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1068552.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:控制台   第三方   如何使用   日志   log4j

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!