Java服务_使用SLF4J&Log4j
1.log发展
1.1 JDK Logging
在编写程序过程中,常常使用system.out.println()来打印过程变量,测试代码逻辑是否正确。当代码出问题时又要删除这些system.out.println()语句,这样非常麻烦,替代方式就是使用日志。
java标准库内置了日志工具包java.util.logging,可以直接使用。
代码示例:
1 | import java.util.logging.Logger; |
控制台输出:
1 | 五月 26, 2022 6:38:32 下午 com.jd.hbase.logtest.JDKLoggingTest main |
- 日志工具类可以自动打印时间、调用类、调用方法等很多有用信息。
- 日志工具类可以设置输出级别,默认输出级别为info,info以下的输出级别不会被打印出来。但是要修改JDK Logging的输出级别等配置不太方便,需要在JVM启动时传递参数。
1.2 Commons Logging
Commons Logging是由apache创建的第三方日志工具,相比于JDK Logging最大的变化:
- 提供了通过LogFactory获取Log类实例的日志接口;
- 提供了重载方法,使得记录异常更加简单,如info(String, Throwable)。
但是Commons Logging只是提供了一些日志接口,还必须挂载其他底层日志系统。如果有Log4j包则使用Log4j作为日志底层,如果没有则使用JDK Logging作为日志底层。
使用前需要引入依赖:
1 | <dependency> |
代码实例:
1 | import org.apache.commons.logging.Log; |
控制台输出:
1 | [2022-05-26 21:04:13:199] [INFO ] [method:com.jd.hbase.logtest.CommonsLoggingTest.main(CommonsLoggingTest.java:10)] |
1.3 Log4j
Log4j是一个用于替代JDK Logging的第三方日志底层实现框架,可以通过xml等配置文件实现组件化。
通过在配置文件中配置不同的appender可以把一条日志输出到不同的目的地,比如:
- console:输出到控制台;
- file:输出到文件;
- socket:通过网络输出到远程计算机;
- jdbc:输出到数据库。
使用Log4j需要将log4j2.xml配置文件放到classpath下。
1.4 SLF4J
SLF4J类似于Commons Logging,是一套日志接口。
SLF4J相比于Commons Logging最大的变化:
- 提供了重载方法,可以传入带占位符的字符串,后面传入的变量自动替换占位符,使得字符串拼接更加自然,如
logger.info("小红的得分是{}分。", 98)。
1.5 Logback
Logback类似于Log4j,是一套日志底层框架。
使用Logback需要将logback.xml配置文件放到classpath下。
2.log4j配置文件配置详解
2.1三大组件
最常用的日志框架就是SLF4J+Log4j。
log4j的配置文件按照版本有log4j.xml和log4j2.xml两种,log4j2.xml在配置规则上进行了一些优化,但大体上的组件和逻辑是相同的。
- Properties:用于定义变量,供文件内其他位置使用;
- appenders:用于定义日志输出的目的地;
- loggers:用于定义日志输出器。
所有的日志输出语句都是先找到loggers,然后每个logger都会绑定一个或多个appenders,将这些日志语句打印到对应的目的地。
2.2 Loggers节点
Loggers主要包含两种具体的日志输出器:Root和Logger。
Root节点主要有两个属性:
- level:用于设置日志输出级别,低于该级别的日志不会被输出打印;
- AppenderRef:用于指定日志输出到哪个appender,必须是本配置文件中定义好的appender的name值。
Logger比Root多了一个属性:
- level:用于设置日志输出级别;
- name:用来指定需要使用该Logger的类或者包的全路径名;
- AppenderRef:用于指定日志输出到哪个appender。(如果没有指定该属性,就会默认继承Root的该属性;如果指定了,就会在该指定appender和Root的appender中都输出;添加additivity=”false”属性,则表示只在自己指定的appender中输出。)
所有日志输出语句都是先找到Logger,判断是否是Logger所指定的类或者包,如果是则按照Logger定义的规则输出,如果不是则传递到Root按照Root定义的规则输出。
2.3 log4j.xml和log4j2.xml实例
log4j.xml:
1 |
|
log4j2.xml:
1 |
|
3.项目应用经验
3.1不同名配置文件加载顺序
log4j选择加载哪一个配置文件的优先级:
- log4j-test.json或log4j-test.jsn
- log4j-test.xml
- log4j.json或log4j.jsn
- log4j.xml
一般在新建项目编写代码时,会创建两个配置文件,log4j-test.xml和log4j.xml,两个配置文件中设置不同的日志输出级别。
比如log4j-test.xml中设置debug,log4j.xml中设置info,本地测试时使用log4j-test.xml可以看到详细的debug日志。正式上线时不要打包log4j-test.xml即可,避免日志文件冗长。
3.2 catalina.out
catalina.out用于记录tomcat的标准输出(stdout)和标准出错(stderr),这是在tomcat的启动脚本里指定的。
我们在tomcat运行项目里使用System.out打印的东西都会到这里来。如果我们在项目里使用其他的日志框架,配置了向Console输出的日志,也会打印到该文件中。比如以log4j为例,如果配置了org.apache.log4j.ConsoleAppender则会输出到catalina.out里。