Java 如何将logback操作记录到文件中?
我想使用logback将“ch.qos.logback”类记录到日志文件中,但它只记录在控制台中,而不记录在文件中 可能吗 我需要它来调查logback的一些问题 这是我的logback配置文件:Java 如何将logback操作记录到文件中?,java,logback,rollingfileappender,logback-classic,Java,Logback,Rollingfileappender,Logback Classic,我想使用logback将“ch.qos.logback”类记录到日志文件中,但它只记录在控制台中,而不记录在文件中 可能吗 我需要它来调查logback的一些问题 这是我的logback配置文件: <?xml version="1.0" encoding="ISO-8859-1"?> <configuration scan="true" scanPeriod="60 seconds"> <property name="base-path" value=".
<?xml version="1.0" encoding="ISO-8859-1"?>
<configuration scan="true" scanPeriod="60 seconds">
<property name="base-path" value="../../xpto/sysX/logs"/>
<property name="application-name" value="app_X"/>
<appender class="ch.qos.logback.core.ConsoleAppender" name="CONSOLE">
<param name="Threshold" value="INFO"/>
<encoder>
<pattern>%d{dd/MM/yyyy HH:mm:ss.SSS} %-5level %logger{30} - %msg%n</pattern>
</encoder>
</appender>
<appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE_LOGBACK">
<param name="Threshold" value="DEBUG"/>
<file>${base-path}/mylog.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${base-path}/%d{yyyy-MM-dd_HH}/mylog.%i.log</fileNamePattern>
<maxHistory>72</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>20MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%.30thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<appender class="ch.qos.logback.classic.AsyncAppender" name="FILE_LOGBACK_ASYNC">
<param name="Threshold" value="DEBUG"/>
<appender-ref ref="FILE_LOGBACK"/>
<queueSize>1000</queueSize>
<discardingThreshold>0</discardingThreshold>
</appender>
<logger additivity="false" level="DEBUG" name="ch.qos.logback">
<appender-ref ref="FILE_LOGBACK"/>
</logger>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_LOGBACK_ASYNC"/>
</root>
</configuration>
我正在使用以下依赖项:
log4j-over-slf4j-1.7.2.jar
logback-classic-1.1.7.jar
logback-core-1.1.7.jar
slf4j-api-1.7.2.jar
提前感谢您提供的背景资料,此输出
14:17:37,117 |-INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [FILE_LOGBACK]
14:17:37,117 |-WARN in ch.qos.logback.core.joran.util.PropertySetter@7f7f557 - No setter for property [Threshold] in ch.qos.logb ack.core.rolling.RollingFileAppender.
14:17:37,118 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@671885015 - No compression will be used
14:17:37,118 |-INFO in c.q.l.core.rolling.TimeBasedRollingPolicy@671885015 - Will use the pattern ../../xpto/sysX/logs/%d{ yyyy-MM-dd_HH}/mylog.%i.log for the active file
14:17:37,119 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@35ca01cb - The date pattern is 'yyyy-MM-dd_HH' from fil e name pattern '.../../xpto/sysX/logs/%d{yyyy-MM-dd_HH}/mylog.%i.log'.
14:17:37,119 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@35ca01cb - Roll-over at the top of every hour.
14:17:37,119 |-INFO in ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP@35ca01cb - Setting initial period to Mon Oct 02 14:17:3
。。。在以下条件下通过Logback发出:
- 您的配置已启用调试(例如,
…
- Logback已确定您的配置中有某些东西保证发出错误或警告消息
- 在类路径上找到多个Logback配置文件
控制台Pender
因此,无法告诉Logback将自己的启动日志事件定向到文件追加器
然而,你真的想要这个Logback输出吗?如果不想要,你可以通过以下两种方式抑制它
- 消除其原因;更改配置,使
不存在错误/警告事件,并且类路径上只有一个Logback配置文件debug=false
- 将无操作状态侦听器添加到配置文件:
- 运行Java进程时将STDOUT重定向到日志文件。例如:
- 将此添加到Java应用程序中的main方法(在初始化Logback之前):
System.setOut(新的PrintStream(“/Users/al/Projects/Sarah2/std.out”);
- 通过管道将Java输出传输到一个文件:
Java-jar…>/some/directory/application\u stdout.log
- 将此添加到Java应用程序中的main方法(在初始化Logback之前):
- 提供您自己的
(而不是ch.qos.logback.core.status.StatusListener
)实现,将这些状态事件写入您选择的文件NopStatusListener
- 使用
(而不是ch.qos.logback.core.status.StatusListenerList
),然后向应用程序添加一些内容,将NopStatusListener
getStatusList()的内容写入到您选择的文件中
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusListener;
import ch.qos.logback.core.util.StatusPrinter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class FileStatusListener implements StatusListener {
private final static String fileName = "path/logbackStatusMessages.log";
@Override
public void addStatusEvent(Status status) {
StringBuilder sb = new StringBuilder();
StatusPrinter.buildStr(sb, "", status);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(fileName, true));
writer.append(sb.toString());
} catch (Throwable ex) {
System.out.println("Error writing to file in FileStatusListener");
ex.printStackTrace(System.err);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException ex) {
System.err.println("Error closing file in FileStatusListener");
ex.printStackTrace(System.err);
}
}
}
}
}
然后在配置文件中将您的类指定为状态侦听器类:
当然,您可能希望使代码更健壮一点,但要将其写入滚动文件
编辑:
更好的是,是一个抽象类,它为写入文件提供了一个更健壮的框架。它可能是比上面的代码更好的选择。非常感谢您的解释!我考虑用它来调查一个大客户的生产环境中的日志问题。因此,它是一个复杂的问题只需在一个文件中记录所有stout。回写只需在文件中停止记录(如果我打开控制台,它将继续在控制台中记录,并在文件中停止),通常它只是为文件配置的。我会等待更多的想法,但我真的感谢您的帮助!!
import ch.qos.logback.core.status.Status;
import ch.qos.logback.core.status.StatusListener;
import ch.qos.logback.core.util.StatusPrinter;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
public class FileStatusListener implements StatusListener {
private final static String fileName = "path/logbackStatusMessages.log";
@Override
public void addStatusEvent(Status status) {
StringBuilder sb = new StringBuilder();
StatusPrinter.buildStr(sb, "", status);
BufferedWriter writer = null;
try {
writer = new BufferedWriter(new FileWriter(fileName, true));
writer.append(sb.toString());
} catch (Throwable ex) {
System.out.println("Error writing to file in FileStatusListener");
ex.printStackTrace(System.err);
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException ex) {
System.err.println("Error closing file in FileStatusListener");
ex.printStackTrace(System.err);
}
}
}
}
}