配置的正确姿势
线上和开发环境的配置要分离,对于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/