原则
完整原则
保证日志包含足够的信息,足够支持内部控制,定位故障,审计,合规要求
有效性
确保日志有效,可读,
最低影响
打印日志肯定损耗性能,但是要将损耗降到最低
一、如何打印日志
1、【禁止】禁止生产环境打印DEBUG日志,禁止打印SYSOUT.OUT日志
代码审查sonar应该提醒去掉sout
2、【禁止】禁止将文件转为base64等形式打印
3、【禁止】禁止将业务字段作为日志字段
如果日志内容是对象,json等,打印日志是应该pattern加引号
es默认1000字段,遇到某子项目几千字段,日志平台不是大数据分析,
另tomcat等日志需要设置pattern,要不然乱七八糟,也会让es误会
4、【建议】注意日志级别
1),可以用warn记录入参错误,
2),err只记录系统出错,内存溢出等无法挽回的异常,自定义的可挽回的异常应该用warn
3),不打印无意义的日志
4),不建议打印查询list,尤其没有分页的
5),保证对象有toString方法,避免输出hash值
6),不要在打印日志时造成异常
log.info(request.getId()); //request为null
7),建议在接口调用,mq消费,task,调度任务等入口地方打印日志,记录时间,入参出参,对排查问题,定位问题有帮助
但是对参数长度应该判断,或者设置豁免打印参数的方法,遇到大报文避免打印
8),不要打印===-----****等日志,这种调试日志应该在发版之前删除
9),单行日志长度不应该超过4KB,
5、【建议】在循环,响应式编程中谨慎log
for(Person p: personList){
log.info("the person info: {} ",JSON.toJsonString(p))
}
6,【建议】批量任务,大量mq,不建议每行均打印
我遇到某子项目:开始时间,报文参数,结束+耗时,一个记录打印三条,每天1:00-5:00之间每小时打印400w条日志,每天啥事儿不做,已经干2000w+日志上去了
7,【建议】gateway等网关中log需谨慎,
gateway默认线程数很少,等你打印io线程消耗性能,遇到上传文件+报文解密+打印日志的时候,并发能力下降到2位数
8,【建议】报文加/解密 前后打印log,没必要
和第三方交互时,入参、出参可能是需要加密和解密,如果报文体积较大,明文和密文都打印没有意义,算法测试成功后,个人认为加解密成功的情况下打印明文,计算失败时异常中打印原文即可
9,【建议】不建议log时字符串拼接,消耗内存和性能。使用占位符替代
建议logback+slf4j即可
10,【建议】建议引入traceId
可以sleuth+zipkin,也可以logback的mac,或者自己使用threadloacl实现
11,【建议】避免重复打印,additivity=false
如果一个日志再root和几个logger里面都有,避免重复打印
12,【建议】自定义的aop,filter,util等中log需谨慎,原则上仅打印debug
可能导致量大的日志
反例:遇到一个傻叉redis的utils打印“redisson del shutdown”265w/天
13,【建议】鉴权,token等内容不建议打印,有安全隐患
而且这个日志也没有啥可读性,都是一串乱码
14,【建议】如果开源jar包日志需要特别注意
如shardingsphere-jdbc等,需要关闭日志
如无法关闭,可以设置独立的logger,和其他应用日志分开
mybatis,eureka心跳等日志建议分开打印,不要和业务日志混在一起
15,【建议】保存完整异常
正例:log.error(“XXX”,e.getMessage(),e);
反例:log.error(“XXX”,e.getMessage());
反例:e.printStacjTrace();
反例:记录了异常,再抛出
16,【建议】actuator通过post接口动态修改日志级别
注意actuator的权限管理
二、字段规范
tomcat,ng日志需要设置pattern
应用日志需要规范字段
三、文件名规范
日志按用途划分,避免业务日志,框架日志,混合,且日志使用rolling进行分割
四、客户端采集规范
本bu采用filebeat采集日志,
可以排除含有某些字段的日志
对分行的日志需要合并,时间开头或者{ 开头的日志才是一行
五、存储规范
目前es中为每个业务方向设置space,每个space可以定义生命周期。
默认2个月,其中qr方向因为日志较大,业务日志30天+全量日志2天。
一类项目集团要求半年,所以hx方向设置为半年。
六、脱敏规范
姓名(中文),姓名(英文),email,手机,固话,银行卡号,家庭地址,
身份证,居住证,社保,医保,公积金,
军官证,警官证
车牌,车架,车辆识别码,行驶证,驾照
。。。
都是需要脱敏的
家庭地址可能正则出问题