logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="/var/log/locakbak" />
<!-- 定义日志文件 输入位置 -->
<property name="logDir" value="/var/log/locakbak" />
<!-- ERROR级别日志 -->
<appender name="siftError" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>deviceId</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="ERROR-${deviceId}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<charset class="java.nio.charset.Charset">UTF-8</charset>
<pattern>%msg%n</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}\%d{yyyyMMdd}\${deviceId}_error.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
</sift>
</appender>
<!-- INFO级别日志 -->
<appender name="siftInfo" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>deviceId</key>
<defaultValue>unknown</defaultValue>
</discriminator>
<sift>
<appender name="INFO-${deviceId}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<encoder>
<pattern>%msg%n</pattern>
<charset class="java.nio.charset.Charset">UTF-8</charset>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${logDir}\%d{yyyyMMdd}\${deviceId}_info.log</fileNamePattern>
<maxHistory>${maxHistory}</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
</sift>
</appender>
<appender name="ASYNC_INFO" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>2048</queueSize>
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="siftInfo"/>
</appender>
<appender name="ASYNC_ERROR" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>2048</queueSize>
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="siftError"/>
</appender>
<root level="INFO">
<!-- 文件输出 -->
<appender-ref ref="ASYNC_INFO" />
<appender-ref ref="ASYNC_ERROR" />
</root>
</configuration>
java 代码
import cn.xxx.mq.entity.Log;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import java.util.Date;
public class LogUtil{
private static Logger log = LoggerFactory.getLogger(LogUtil.class);
public static void errorLog(String devId, String title, String cmd, JSONObject msg){
Log logEntity = new Log(devId,DateTimeUtil.dateToStr(new Date(),DateTimeUtil.STANDARD_FORMAT),
title,cmd,msg);
MDC.put("deviceId", devId);
log.error(JSONObject.toJSONString(logEntity));
}
public static void infoLog(String devId,String title,String cmd,JSONObject msg){
Log logEntity = new Log(devId,DateTimeUtil.dateToStr(new Date(),DateTimeUtil.STANDARD_FORMAT),
title,cmd,msg);
MDC.put("deviceId", devId);
log.info(JSONObject.toJSONString(logEntity));
}
}