大黄:谁提的代码,怎么日志全是logger.info,异常也是?(一通找svn版本最终发现是小志)
大黄:小志,为啥程序中日志打印不分级别呢?
小志:我分了的,都用info
大黄:那什么是日志分级呢?(无奈)
小志:……
01
什么是日志分级
现在的程序工程都比较庞大,为了开发调试和生产问题跟踪排查,通常都会加入专业的日志框架,负责日志的打印。
Java工程常用的日志框架有log4j,log4j2,logback等。在这些日志框架中会提供日志级别,以响应不同的程序运行事件,记录日志。其中日志记录器(Logger)是日志处理的核心组件。 org.apache.log4j.Level类提供以下级别,但也可以通过Level类的子类自定义级别
Level | 描述 |
---|---|
ALL | 各级包括自定义级别 |
DEBUG | 指定细粒度信息事件是最有用的应用程序调试 |
ERROR | 错误事件可能仍然允许应用程序继续运行 |
FATAL | 指定非常严重的错误事件,这可能导致应用程序中止 |
INFO | 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息 |
OFF | 这是最高等级,为了关闭日志记录 |
TRACE | 指定细粒度比DEBUG更低的信息事件 |
WARN | 指定具有潜在危害的情况 |
log4j具有5种正常级别(Level)。
日志记录器(Logger)的可用级别Level (不包括自定义级别 Level)
static Level DEBUG
DEBUG Level指出细粒度信息事件对调试应用程序是非常有帮助的。
static Level INFO
INFO level表明 消息在粗粒度级别上突出强调应用程序的运行过程。
static Level WARN
WARN level表明会出现潜在错误的情形。
static Level ERROR
ERROR level指出虽然发生错误事件,但仍然不影响系统的继续运行。
static Level FATAL
FATAL level指出每个严重的错误事件将会导致应用程序的退出。
另外,还有两个可用的特别的日志记录级别:
static Level ALL
ALL Level是最低等级的,用于打开所有日志记录。
static Level OFF
OFF Level是最高等级的,用于关闭所有日志记录。
日志记录器(Logger)的行为是分等级的。
02
为什么要日志分级
- 可以区分不同场景下日志打印,如测试环境日志打印级别为all打印全量日志,生产环境可以调整为info级别
- 可以根据日志级别过滤日志。问题排查可以直接搜索error级别日志。error方法可以打印错误的堆栈信息。
- 规范编程,降低系统维护和沟通成本。正常情况下info级别的日志是提示信息,如果错误级别也打info级别。很容易忽略问题,对团队其它成员造成误解,排查问题费时费力。所以要规范编程。
03
怎么合理安排日志打印
- try-catch中要抛出error级别的,信息要描述清楚。例:
logger.error("错误",e)
- 关键函数入参和结果要打印info级别日志。例:转账函数,要在转账之前和转账后的金额,关键参数打印全部,方便跟踪。
- 忌日志打印过多,日志打印本身也消耗资源。无用的日志不要打印,不要重复打印与交易无关的日志信息。
- 日志遵循宁多勿少,方便定位生产问题。防止交易编程黑盒操作。所以该打的日志一定要打。
- 生产环境debug日志会关掉,所以 关键信息不要用debug级别打印。