引入 Jar包
gradle 配置:
apply plugin: 'java'
apply plugin: 'idea'
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
repositories {
mavenLocal()
maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter()
mavenCentral()
}
dependencies {
...
compile group: 'org.slf4j', name: 'log4j-over-slf4j', version: '1.7.25'
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.25'
compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
compile group: 'ch.qos.logback', name: 'logback-core', version: '1.2.3'
compile group: 'ch.qos.logback', name: 'logback-access', version: '1.2.3'
...
}
jar {
manifest {
attributes 'Manifest-Version': '1.0'
attributes "Class-Path": configurations.compile.collect { it.getName() }.join(' ')
}
}
代码设置日志变量
String content = String.format("%s_%s_%s_%s: %s", awsLog.code, awsLog.uid, awsLog.logType, GetDate(), JSON.toJSONString(awsLog));
MDC.put("AwsLogType", awsLog.logType.toString());
MDC.put("test", awsLog.date);
itemLoggerService.log(content);
MDC.remove("AwsLogType");
MDC.remove("test");
logback.xml 的配置
<?xml version="1.0" encoding="UTF-8"?>
<!-- 从高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- 属性描述 scan:性设置为true时,配置文件如果发生改变,将会被重新加载, 默认值为true scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。
当scan为true时,此属性生效。默认的时间间隔为1分钟。 debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="10 seconds" debug="false">
<!-- 定义日志文件 输入位置 -->
<property name="log_dir" value="logs" />
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="8640" />
...
<property name="pay_log_dir" value="paylogs" />
<appender name="PAY_HISTORY" class="ch.qos.logback.classic.sift.SiftingAppender">
<!-- discriminator 的默认实现类 ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
<discriminator>
<key>AwsLogType</key>
<defaultValue>none</defaultValue>
</discriminator>
<sift>
<appender name="FILE-${AwsLogType}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- discriminator 的默认实现类 ch.qos.logback.classic.sift.MDCBasedDiscriminator -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${pay_log_dir}/%d{yyyy-MM-dd,aux}/%d{HH,aux}/%d{mm}/%d{yyyyMMdd,aux}_%d{HH,aux}_${AwsLogType}.log</fileNamePattern>
<maxHistory>8640</maxHistory>
</rollingPolicy>
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${pay_log_dir}/%d{yyyy-MM-dd}/item_%d{yyyyMMdd}_%d{HH}_%i.log</fileNamePattern>-->
<!-- <maxHistory>8640</maxHistory>-->
<!-- <maxFileSize>10MB</maxFileSize>-->
<!-- </rollingPolicy>-->
<encoder>
<charset>UTF-8</charset>
<pattern>%msg%n</pattern>
</encoder>
</appender>
</sift>
</appender>
...
<logger name="com.kd.gameserver.module.filelog" additivity="false">
<level value="INFO" />
<appender-ref ref="PAY_HISTORY"/>
</logger>
</configuration>
有坑
在设置生产的文件名时,比如每小时切割,可以有多个日期变量,但是其他只能有一个主变量,其他辅助变量需要用 aux 标注,否则存在多个非 aux 日期变量时,每小时切割文件会失效。
...
<fileNamePattern>${pay_log_dir}/%d{yyyy-MM-dd,aux}/%d{HH,aux}/%d{mm}
...
原文:
经验
百度三分钟解决不了的事情,就应该查看官网手册!
附录
[1] logback 官网手册
[2] 日志框架 Logback 官方手册(第四章:Appenders)
[3] 使用SLF4J在多线程下输出到不同的日志文件