我使用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进行回溯,属性如下:
<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属性并使其记录到文件或禁用日志?
答案 0 :(得分:0)
您可以尝试将STDOUT记录为INFO,将STDERR记录为WARNING,例如:
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" />