In real development, we often have such requirements, and we need to distinguish business logs from system logs for different collections.
If logback is used as the log component, how to write different logs to different files?
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>
enum 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;
}
}
Log tool class 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());
}
}
log print
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("我是业务日志");
}
}
output result
biz.log:
[2018-03-26 18:23:22.791] INFO [restartedMain] Application.java:33 - I am business log
sys.log:
[2018-03-26 18:23:22.791] INFO [restartedMain] Application.java:32 - I am syslog
In this way, we can customize the processing for different log files.