log4j与logback(简介,配置项解释,配置示例,使用说明)

文章目录

  • 共性
    • 配置项含义
    • 指定配置文件
  • 常用实践
  • 注意事项
    • log.isDebugEnabled()
    • 开发时使用带作者名的日志
    • 代码合并到master之前检查日志
  • 附录
    • logj.properties写法
    • logback.xml写法

commons logging和slf4j是日志接口,而log4j和logback是日志实现。实际使用时,一般都是接口+实现的组合。(题外话:slf4j最让人印象深刻的可能就是大括号占位符了。)
log4j和logback均为流行的日志实现(本文作于2021年6月),为同一人所作,logback是log4j的升级版。
logback的介绍此文非常全面:https://www.cnblogs.com/ryelqy/p/10314147.html

共性

配置项含义

日志等级有五种,ERROR,WARN,INFO,DEBUG,TRACE,优先级从高到低,配置文件中设置的优先级称为threshold,如果消息来源的级别低于threshold,就不会输出。

两者都会配置appender,也就是输出位置。可以是文件,终端,套接字等等。

两者都有打日志的logger(子节点)和root(根节点)。也可以理解为局部设置和全局设置。

注意类名和名称的区别。比如,log4j.appender.Console = org.apache.log4j.ConsoleAppender中,Console只是输出位置的名字,等号右边的才是类名。

rolling刷新策略,如log4j.appender.File = org.apache.log4j.DailyRollingFileAppender,表示每天生成日志文件,今天的会覆盖昨天的,避免日志无限膨胀(或者可以保存近30天的)。也有根据size来刷新的策略,比如maxFileSize=5MB。

格式化输出(layout、pattern等有关配置),除了日志信息本身,还可以输出年月日时分秒等,以及等级、消息来源类等。

指定配置文件

如果不指定配置文件,按默认设置。
如果在resources下有logback.xml或log4j.properties,则按此设置运行(spring框架中,名字叫logback-spring.xml,默认识别名字可能会变)。
如果通过-Dlogback.configurationFile或-Dlog4j.configuration进行了指定,则按指定的来。
(三者的优先级逐渐升高)

常用实践

一般每个类里实例化一个logger,这样在日志中就能看出日志来源类:

private static final Logger logger = LoggerFactory.getLogger(当前类.class);

常见的情况是,打印日志的类特别多,或是低等级信息影响了高等级信息观察。

对于log4j,可以将不同的类的日志信息以不同的threshold输出到不同的文件。也可以将不同级别的日志信息输出到不同的文件,一般把debug打在stdout控制台,更高的三级打到不同的文件。

对于logback,可以将不同的类,或不同的包,的日志信息以不同的threshold输出到不同的文件。
至于如何实现,logback我已亲测(场景是,屏蔽httpclient的大量输出),见附录;附录中log4j的demo较为简单,没有用到此功能。如有需要可以上网搜索“log4j 不同的类输出到不同文件”。

注意事项

log.isDebugEnabled()

历史遗留代码中,可能会出现这样的:

if (log.isDebugEnabled()) {
	log.debug("some debug info");
}

{}模板是后来才有的功能。当时只能通过+来实现字符串拼接,这会导致不管日志等级为何,执行时都会做一次字符串拼接。在循环中,这样的开销是不可接受的。使用{}模版之后,就没必要做isDebugEnabled()的判断了。

开发时使用带作者名的日志

多人协作的时候,可能会出现每个人都加几句日志的情况。因此,可以在日志中加上自己的名字,方便在输出中搜索,也方便开发告一段落后清理。

代码合并到master之前检查日志

降低级别,删除不必要的日志,特别关注循环体中的日志。

附录

logj.properties写法

log4j.rootLogger = INFO, Console, File

log4j.appender.Console = org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target = System.out
log4j.appender.Console.layout = org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

log4j.appender.File = org.apache.log4j.DailyRollingFileAppender
log4j.appender.File.File = ./log.log
log4j.appender.File.Append = true
log4j.appender.File.Threshold = INFO
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

logback.xml写法

<configuration>
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
		encoder>
	appender>
	
	<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<encoder>
			<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%npattern>
			<charset>utf-8charset>
		encoder>
		<file>log/output.logfile>
		<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
			<fileNamePattern>log/output.log.%ifileNamePattern>
		rollingPolicy>
		<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
			<MaxFileSize>1MBMaxFileSize>
		triggeringPolicy>
	appender>

	<root level="INFO">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	root>

	<logger name="org.apache" level="ERROR">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	logger>

	<logger name="httpclient" level="ERROR">
		<appender-ref ref="CONSOLE" />
		<appender-ref ref="FILE" />
	logger>
configuration>

你可能感兴趣的:(java,log4j,logback)