我想异步记录到2个文件,一个用于系统日志记录,另一个用于用户操作记录。到目前为止,我正在登录1个文件,我的配置文件如下所示:
<configuration debug="true">
<property name="LOG_DIR" value="C:/blah" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{DD/MM/YYYY-HH:mm:ss.SSS} %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${LOG_DIR}/log.txt</file>
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{35} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="com.logger.name" level="DEBUG" />
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
<root level="warn">
<appender-ref ref="STDOUT" />
<appender-ref ref="ASYNC" />
</root>
</configuration>
我创建了一个这样的记录器:
public static final Logger LOG = LoggerFactory.getLogger("com.logger.name");
这很好用,但是如果我要记录到2个单独的文件,我是否需要编写第二个配置文件?我还需要第二个Logger
对象吗?我想有一个配置并指定在创建Logger
对象时记录哪个文件,这可能吗?谢谢!
修改
为了澄清,我想将用户操作记录到一个文件,系统记录到另一个文件。
答案 0 :(得分:1)
您可以使用两个文件追加器,一个用于系统日志记录,另一个用于用户操作日志记录。文件应用程序扩展UnsynchronizedAppenderBase
因此它们是异步的。无需创建Logger对象。这是一个例子。
<appender name="fileAppender1" class="ch.qos.logback.core.FileAppender">
<file>c:/kp/kp1.log</file>
<filter class="com.kp.filters.KPFilter">
</filter>
<append>true</append>
<encoder>
<pattern>%d [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="fileAppender1" />
</root>
<appender name="fileAppender2" class="ch.qos.logback.core.FileAppender">
<file>c:/kp/kp2.log</file>
<append>true</append>
<encoder>
<pattern>
%d [%thread] %-5level %logger{30} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="org.kp">
<appender-ref ref="fileAppender2" />
<level value="debug"/>
</logger>
KPFilters.class
public class KPFilter extends Filter<ILoggingEvent> {
@Override
public FilterReply decide(ILoggingEvent event) {
if(event.getLoggerName() !=null && event.getLoggerName().startsWith("org.kp")){
return FilterReply.DENY;
}
return FilterReply.ACCEPT;
}
}
如果您希望将日志写入您的软件包生成的文件,您可以使用下面给出的
<logger name="com.kp">
<level value="trace" />
<appender-ref ref="fileappender2" />
</logger>
在最糟糕的情况下,您可以通过扩展UnsynchronizedAppenderBase
创建自定义appender并编写自定义代码来处理错误消息。根据消息类型或消息字符串,您可以编写业务逻辑以写入文件或跳过错误消息。
**EDITED:**
您可以通常的方式初始化日志。例如,如果您想登录MyClass。
private static final Logger LOG = LoggerFactory.getLogger(MyClass.class);
LOG.warn("Hello");
Logback back将日志实例传递给两个appender。这将被写入两个不同的文件。