最近对公司的现有日志进行了处理,使用的是logback
需求是按照级别输出,同时能按照业务将日志写入不同文件中。
以下是我的配置文件,直接放入resource目录下即可运行
logback.xml文件
其中日志格式这块因为我加入了zipkin生产traceid的逻辑,实现链路追踪,方便知道分布式中服务间调用关系,实际使用中删除掉即可
<?xml version="1.0" ?>
<!-- 日志输出规则 根据当前ROOT级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="30 seconds">
<!-- 日志上下文名称 -->
<contextName>OPENAPI-LOGGING</contextName>
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="30"/>
<!-- 定义日志文件 输入位置 -->
<property name="log_dir_sys" value="./logs/openapi/sys" />
<property name="log_dir_business" value="./logs/openapi/business" />
<!--==================指定输出位置=================-->
<!--++++++++++++++++++输出到控制台++++++++++++++++++++++++++++++-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!-- 输出格式 -->
<encoder charset="UTF-8">
<pattern>[%boldRed(%d{HH:mm:ss.SSS})] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %highlight(%level) [%boldRed(%thread)] %boldMagenta([%file:%line]) - %cyan(%msg%n)</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--==================指定级别输出文件=================-->
<!--++++++++++++++++++记录文件(按日志级别输出INFO)+++++++++++++++++-->
<appender name="SYS_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir_sys}/info.log</File>
<append>true</append>
<!--过滤器,只打INFO级别的日志-->
<!-- 级别过滤 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
<level>INFO</level>
<!-- 用于配置符合过滤条件的操作 -->
<onMatch>ACCEPT</onMatch>
<!-- 用于配置不符合过滤条件的操作 -->
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir_sys}/%d{yyyy-MM-dd}/info.%d{MM-dd}.log</fileNamePattern>
<!-- 开启日志保留天数,大于30天后自动删除 -->
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{HH:mm:ss.SSS}] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %level [%thread] [%file:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--++++++++++++++++++记录文件(按日志级别输出ERROR)+++++++++++++++++-->
<appender name="SYS_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir_sys}/error.log</File>
<append>true</append>
<!--过滤器,只打INFO级别的日志-->
<!-- 级别过滤 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 -->
<level>ERROR</level>
<!-- 用于配置符合过滤条件的操作 -->
<onMatch>ACCEPT</onMatch>
<!-- 用于配置不符合过滤条件的操作 -->
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir_sys}/%d{yyyy-MM-dd}/error.%d{MM-dd}.log</fileNamePattern>
<!-- 开启日志保留天数,大于30天后自动删除 -->
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{HH:mm:ss.SSS}] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %level [%thread] [%file:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--==================不同业务逻辑的日志打印到不同文件=================-->
<appender name="BUSINESS_USER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir_business}/user/business_user.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir_business}/user/%d{yyyy-MM-dd}/business_user.%d{MM-dd}.log</fileNamePattern>
<!-- 开启日志保留天数,大于30天后自动删除 -->
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{HH:mm:ss.SSS}] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %level [%thread] [%file:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="BUSINESS_ORDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir_business}/order/business_order.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir_business}/order/%d{yyyy-MM-dd}/business_order.%d{MM-dd}.log</fileNamePattern>
<!-- 开启日志保留天数,大于30天后自动删除 -->
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{HH:mm:ss.SSS}] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %level [%thread] [%file:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="BUSINESS_QRCODE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir_business}/qrcode/business_qrcode.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir_business}/qrcode/%d{yyyy-MM-dd}/business_qrcode.%d{MM-dd}.log</fileNamePattern>
<!-- 开启日志保留天数,大于30天后自动删除 -->
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{HH:mm:ss.SSS}] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %level [%thread] [%file:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="BUSINESS_ADMIN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir_business}/admin/business_admin.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir_business}/admin/%d{yyyy-MM-dd}/business_admin.%d{MM-dd}.log</fileNamePattern>
<!-- 开启日志保留天数,大于30天后自动删除 -->
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{HH:mm:ss.SSS}] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %level [%thread] [%file:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="BUSINESS_TICKET" class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>${log_dir_business}/ticket/business_ticket.log</File>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log_dir_business}/ticket/%d{yyyy-MM-dd}/business_ticket.%d{MM-dd}.log</fileNamePattern>
<!-- 开启日志保留天数,大于30天后自动删除 -->
<maxHistory>30</maxHistory>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder charset="UTF-8">
<pattern>[%d{HH:mm:ss.SSS}] %contextName [%X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] %level [%thread] [%file:%line] - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 不同的业务逻辑日志打印到指定文件夹-->
<logger name="businessUser" additivity="false" level="debug">
<appender-ref ref="BUSINESS_USER"/>
</logger>
<logger name="businessOrder" additivity="false" level="debug">
<appender-ref ref="BUSINESS_ORDER"/>
</logger>
<logger name="qrCode" additivity="false" level="debug">
<appender-ref ref="BUSINESS_QRCODE"/>
</logger>
<logger name="admin" additivity="false" level="debug">
<appender-ref ref="BUSINESS_ADMIN"/>
</logger>
<logger name="ticket" additivity="false" level="debug">
<appender-ref ref="BUSINESS_TICKET"/>
</logger>
<!--info和error分开打印-->
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="SYS_INFO"/>
<appender-ref ref="SYS_ERROR"/>
</root>
</configuration>
LogFileName.java 枚举常量
public enum LogFileName {
//配置到logback.xml中的logger name="businessUser"
USERLOG("businessUser"),
ORDERLOG("businessOrder"),
QRCODELOG("qrCode"),
ADMINLOG("admin"),
TICKETLOG("ticket");
private String logFileName;
LogFileName(String fileName) {
this.logFileName = fileName;
}
public String getLogFileName() {
return logFileName;
}
public void setLogFileName(String logFileName) {
this.logFileName = logFileName;
}
}
LoggerUtils.java
public class LoggerUtils {
public static <T> org.slf4j.Logger Logger(Class<T> clazz) {
return LoggerFactory.getLogger(clazz);
}
/**
* 打印到指定的文件下
*
* @param desc 日志文件名称
* @return
*/
public static org.slf4j.Logger Logger(LogFileName desc) {
return LoggerFactory.getLogger(desc.getLogFileName());
}
}
AppTest.java测试类
@SpringBootTest(classes = ApplicationOpenApi.class)
public class AppTest {
Logger USERLOG = LoggerUtils.Logger(LogFileName.USERLOG);
Logger ORDERLOG = LoggerUtils.Logger(LogFileName.ORDERLOG);
Logger QRCODELOG = LoggerUtils.Logger(LogFileName.QRCODELOG);
Logger ADMINLOG = LoggerUtils.Logger(LogFileName.ADMINLOG);
Logger TICKETLOG = LoggerUtils.Logger(LogFileName.TICKETLOG);
Logger logger = LoggerFactory.getLogger(AppTest.class);
@Test
public void testGetBusinessAccount() throws Exception {
String a="123";
Map<String,Object> map = new HashMap<String, Object>();
map.put("1", 123);
map.put("2", "456");
System.out.println("2");
logger.warn("324234244234wsrwerwer");
logger.debug("324234244234wsrwerwer");
logger.error("324234244234wsrwerwer");
USERLOG.info("用户日志map:[{}]---string:[{}]",map,a);
ORDERLOG.info("订单日志");
QRCODELOG.info("二维码日志");
ADMINLOG.info("用户管理后台日志");
USERLOG.error("用户日志");
ORDERLOG.error("订单日志");
QRCODELOG.error("二维码日志");
ADMINLOG.error("用户管理后台日志");
TICKETLOG.error("车票日志");
}
}