【谈】程序中日志分级打印

大黄:谁提的代码,怎么日志全是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级别打印。

你可能感兴趣的:(【谈】程序中日志分级打印)