logback推荐配置
配置的正确姿势
线上和开发环境的配置要分离,对于java项目
src/main/resources 目录下的东西都是正式环境使用的
src/test/resources 目录下的东西才是本机开发环境使用的
如果你发现自己本机开发启动程序的时候,经常要修改 src/main/resources 目录下的东东,那就说明你用错了。
这样做的一个后果就是,你提交代码的时候,忘记修改回来,结果发布到线上去了。轻则日志量暴增,重则引起运营事故。
所以大家千万注意!!!
推荐的配置内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
< configuration scan = "false" scanPeriod = "60 seconds" debug = "false" > < appender name = "RollingFile" class = "ch.qos.logback.core.rolling.RollingFileAppender" > <!-- 可让每天产生一个日志文件,最多 7 个,自动回滚 --> < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > < fileNamePattern >${catalina.home}/logs/fs-app-%d{yyyyMMdd}.log.zip</ fileNamePattern > < maxHistory >7</ maxHistory > </ rollingPolicy > < encoder > <!-- 日志中默认打印traceId和userId,方便定位问题,异常栈中去掉包含如下字符的行避免打印很多无用的信息--> < pattern >%d{HH:mm:ss} [%thread] %-5level %logger{12} %X{traceId} %X{userId} %msg%rEx{full, java.lang.Thread, javassist, sun.reflect, org.springframework, org.apache, org.eclipse.jetty, $Proxy, java.net, java.io, javax.servlet, org.junit, com.mysql, com.sun, org.mybatis.spring, cglib, CGLIB, java.util.concurrent, okhttp, org.jboss, }%n </ pattern > </ encoder > </ appender > <!-- 异步输出日志避免阻塞服务 --> < appender name = "ASYNC" class = "ch.qos.logback.classic.AsyncAppender" > < queueSize >512</ queueSize > < appender-ref ref = "RollingFile" /> </ appender > <!-- 配置基础组件为WARN级别,避免打印过多影响服务自己日志 --> < logger name = "druid.sql" level = "INFO" /> < logger name = "org.hibernate" level = "WARN" /> < logger name = "org.springframework" level = "WARN" /> < logger name = "org.apache" level = "WARN" /> < root level = "info" > < appender-ref ref = "ASYNC" /> </ root > </ configuration > |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
< configuration scan = "false" scanPeriod = "60 seconds" debug = "false" > < appender name = "STDOUT" class = "ch.qos.logback.core.ConsoleAppender" > < encoder > < pattern >%d{HH:mm:ss} [%thread] %-5level %logger{12} %X{traceId} %X{userId} %msg%n</ pattern > </ encoder > </ appender > < logger name = "org.hibernate" level = "WARN" /> < logger name = "org.springframework" level = "WARN" /> < logger name = "org.apache" level = "WARN" /> < root level = "DEBUG" > < appender-ref ref = "STDOUT" /> </ root > </ configuration > |
推荐日志级别
极为严格的做法是:只要log.error()记录的内容,都需要人及时响应的,有些公司会针对error进行字符串告警。
那么,针对一些:没有权限、参数错误、非法请求等,由于不合理的请求进来的,就建议打印warn而不是error,否则狼来了喊多了就没有用了。也会淹没真正的错误。
简单来讲,真正影响到正常用户的正常请求而且需要及时响应的错误,就打印ERROR,否则打印WARN。
一般信息打印info,针对调试操作,打印debug
推荐使用日志占位符
log.info("this is a={}, b={}", a, b)
使用占位符,是真正需要打印的时候,才进行字符串拼接;如果不打印就不会拼接字符串。
log.error("cannot open url={}", url, e)
针对error,务必把异常栈打印出来,这里最有一个exception对象,不需要使用占位符,如果多一个占位符,则只会打印e.getMessage()的内容,就不方便查问题了。
和日志中心的配合
通过引入日志中心的组件并添加配置,可以实现把特定logger和特定用户的日志进入日志中心,异常信息入日志中心等功能。
< dependency > < groupId >com.fxiaoke</ groupId > < artifactId >logconfig-core</ artifactId > < version >${logconfig-core.version}</ version > </ dependency > < dependency > < groupId >com.fxiaoke.common</ groupId > < artifactId >metrics-oss</ artifactId > < version >${metrics-oss.version}</ version > </ dependency > |
修改spring的配置文件,加入如下内容
< bean class = "com.fxiaoke.metrics.MetricsConfiguration" /> |
这样就可以通过 http://oss.firstshare.cn/logconf/ 在线调整日志级别,以及查看日志内容了
可以在 进程管理系统 http://oss.firstshare.cn/pms/ 查看自己进程的jvm信息,cpu和内容消耗等信息
还可以在日志中心 http://log.foneshare.cn/ 查到自己服务的所有error,不必登录多个机器查找了。可以针对userId搜索错误情况。
简易日志中心: http://oss.foneshare.cn/flog/
kibana:http://log.foneshare.cn/