真实开发中我们经常有这样的需求,需要将业务日志和系统日志进行区分,进行不同的采集。
如果使用logback作为日志组件,该怎么将不同日志写到不同文件呢?
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property name="LOG_HOME" value="${catalina.base}/logs"/>
<property name="encoding" value="UTF-8"/>
<property name="normal-pattern"
value="%d{yyyy-MM-dd/HH:mm:ss.SSS}|%X{localIp}|%X{requestId}|%X{requestSeq}|^_^|[%t] %-5level %logger{50} %line - %m%n"/>
<property name="plain-pattern" value="%d{yyyy-MM-dd.HH:mm:ss} %msg%n"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>
%d{yyyy-MM-dd/HH:mm:ss.SSS}|%X{localIp}|%X{requestId}|%X{requestSeq}|^_^|[%t] %-5level %logger{50} %line - %m%n
</pattern>
</encoder>
</appender>
<!--不同业务逻辑的日志打印到不同文件-->
<appender name="bizLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/biz.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/biz.log.%d</fileNamePattern>
<maxHistory>12</maxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="sysLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${LOG_HOME}/sys.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_HOME}/sys.log.%d</fileNamePattern>
<maxHistory>12</maxHistory>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] %level [%thread] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 不同的业务逻辑日志打印到指定文件夹-->
<logger name="bizLog" additivity="false" level="INFO">
<appender-ref ref="bizLogAppender"/>
</logger>
<logger name="sysLog" additivity="false" level="INFO">
<appender-ref ref="sysLogAppender"/>
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
枚举LogFileName
public enum LogFileName {
SYS_LOG("sysLog"),
BIZ_LOG("bizLog");
private String logFileName;
LogFileName(String fileName) {
this.logFileName = fileName;
}
public String getLogFileName() {
return logFileName;
}
public void setLogFileName(String logFileName) {
this.logFileName = logFileName;
}
public static LogFileName getAwardTypeEnum(String value) {
LogFileName[] arr = values();
for (LogFileName item : arr) {
if (null != item && !item.logFileName.equals("")) {
return item;
}
}
return null;
}
}
日志工具类LoggerUtils
public class LoggerUtils {
public static <T> Logger Logger(Class<T> clazz) {
return LoggerFactory.getLogger(clazz);
}
/**
* 打印到指定的文件下
*
* @param desc 日志文件名称
* @return
*/
public static Logger Logger(LogFileName desc) {
return LoggerFactory.getLogger(desc.getLogFileName());
}
}
日志打印
public class Application {
private static final Logger sys_Log = LoggerUtils.Logger(LogFileName.SYS_LOG);
private static final Logger biz_Log = LoggerUtils.Logger(LogFileName.BIZ_LOG);
public static void main(String[] args) {
sys_Log.info("我是系统日志");
biz_Log.info("我是业务日志");
}
}
输出结果
biz.log:
[2018-03-26 18:23:22.791] INFO [restartedMain] Application.java:33 - 我是业务日志
sys.log:
[2018-03-26 18:23:22.791] INFO [restartedMain] Application.java:32 - 我是系统日志
这样我们针对不同的日志文件可以自定义进行处理了。