- 使用SLF4J的风格:
Log4J的风格:log.debug("Found " + records + " records matching filter: '" + filter + "'");
SLF4J的风格:log.debug("Found {} records matching filter: '{}'", records, filter);
- 正确定义日志输出级别:(生产环境一般不输出debug以下级别的日志)
fatal - 严重的,造成服务中断的错误;
error - 其他错误运行期错误;
warn - 警告信息,如程序调用了一个即将作废的接口,接口的不当使用,运行状态不是期望的但仍可继续处理等;
info - 有意义的事件信息,如程序启动,关闭事件,收到请求事件等;
debug - 调试信息,可记录详细的业务处理到哪一步了,以及当前的变量状态;
trace - 更详细的跟踪信息;
- 适当地给方法的输入输出加上日志 :
- 输出Exceptions的全部Throwable信息,因为logger.error(msg)和logger.error(msg,e.getMessage())这样的日志输出方法会丢失掉最重要的StackTrace信息。
- 不允许记录日志后又抛出异常,因为这样会多次记录日志,只允许记录一次日志。
- 不允许出现System print(包括System.out.println和System.error.println)语句。
- 不允许出现printStackTrace。
- 输出有意义的日志: 每一条日志数据会包括描述和上下文两部分
无意义输出:log.info("");
只包含描述:log.debug("Message processed");
只包含上下文:log.debug(message.getJMSMessageID());
真正有意义的日志:log.debug("Message with id '{}' processed", message.getJMSMessageID());
- 不要日志中加上一个莫名其妙的内容, 即所谓的"magic log".
比如有些程序员会在日志中随手敲上"&&&!#"这样一串字符, 用来帮助他们定位.
- 能够一行日志搞定的,不要拆分成几行,增加查看和维护的成本
- 尽量减少日志中中文的使用
- 切记不要在日志中包含密码和个人隐私信息!
- 不要在日志信息中包含全限定名:
- 对于你输出的每一条log信息, 请仔细检查最终输出的内容是否存在问题
避免日志中出现NPE(空指针异常);
比如类属性的get方法、toString的使用等等
- 一个理想的日志模式将包含下列信息:
- 当前时间(不需要包含日志, 精确到毫秒)(日志模式配置中可以做)
- 日志级别(如果你关心这个)
- 线程名称
- 简单的日志名(非全限定名的那种)
- 日志描述信息