Java中有许多种日志记录方式,有些API有占位符,有些API没占位符,初学的人可能会搞不清楚这些日志组件的由来。我一开始的时候也是很懵逼的,后来一点点弄懂了于是就又了这篇文章。

在Java中进行日志记录常见有三种方式,分别是JDKLog、Log4J、LogBack

一、JDKLog

JDKLog记录方式是JDK官方提供的一个记录日志的方式,直接在JDK中就可以使用。但JDKLog其功能比较简单,现在用的人也很少。

  1. import java.util.logging.Logger;
  2.  
  3. /**
  4. * JDKLog Demo
  5. */
  6. public class JDKLog
  7. {
  8. public static void main( String[] args )
  9. {
  10. Logger logger = Logger.getLogger("JDKLog");
  11. logger.info("Hello World.");
  12. }
  13. }

二、LOG4J

LOG4J 是 Apache 的一个日志开源框架,使用的人数也不少,有多个分级(DEBUG/INFO/WARN/ERROR)记录,但LOG4J本身不支持使用占位符,这给日志记录带来了极大的不便。虽然LOG4J确实有一些不便之处,但是LOG4J已经能够满足很多项目的需求,如果把JDKLog比喻成一把小刀的话,那么LOG4J就是一把手枪了。

LOG4J 有 1.X 版本和 2.X 版本,现在官方推荐使用 2.X 版本,2.X 版本在架构上进行了一些升级,配置文件也发生了一些变化,但好在官方的配置说明文档非常清楚。下面我们就以 LOG4J 2.6.2 为例来介绍如何使用 LOG4J。

使用 LOG4J 2.6.2 首先需要导入所依赖的两个 Jar 包:

  1. <!-- Log4J -->
  2. <dependency>
  3. <groupId>org.apache.logging.log4j</groupId>
  4. <artifactId>log4j-api</artifactId>
  5. <version>2.6.2</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.apache.logging.log4j</groupId>
  9. <artifactId>log4j-core</artifactId>
  10. <version>2.6.2</version>
  11. </dependency>

增加配置文件 log4j2.xml 放在 resource 目录下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="WARN">
  3. <Appenders>
  4. <Console name="Console" target="SYSTEM_OUT">
  5. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
  6. </Console>
  7. </Appenders>
  8. <Loggers>
  9. <Root level="info">
  10. <AppenderRef ref="Console"/>
  11. </Root>
  12. </Loggers>
  13. </Configuration>

<Root>节点的 level 属性表示输出的最低级别。

编写测试类:

  1. import org.apache.logging.log4j.LogManager;
  2. import org.apache.logging.log4j.Logger;
  3.  
  4. /**
  5. * Log4J Demo
  6. */
  7. public class Log4jLog {
  8. public static void main(String args[]) {
  9. Logger logger = LogManager.getLogger(Log4jLog.class);
  10. logger.debug("Debug Level");
  11. logger.info("Info Level");
  12. logger.warn("Warn Level");
  13. logger.error("Error Level");
  14. }
  15. }

运行测试类输出结果:

  1. 10:16:08.279 [main] INFO com.chanshuyi.Log4jLog - Info Level
  2. 10:16:08.280 [main] WARN com.chanshuyi.Log4jLog - Warn Level
  3. 10:16:08.280 [main] ERROR com.chanshuyi.Log4jLog - Error Level

如果没有配置 log4j2.xml 配置文件,那么LOG4J讲自动启用类似于下面的的配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Configuration status="WARN">
  3. <Appenders>
  4. <Console name="Console" target="SYSTEM_OUT">
  5. <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
  6. </Console>
  7. </Appenders>
  8. <Loggers>
  9. <Root level="error">
  10. <AppenderRef ref="Console"/>
  11. </Root>
  12. </Loggers>
  13. </Configuration>

输出结果:

  1. ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
  2. 11:40:07.377 [main] ERROR com.chanshuyi.Log4jLog - Error Level

如果你没有配置文件,那么控制台会输出提示你没有编写配置文件。

三、LogBack

LogBack 可以对比起 Log4J 有更快的运行速度,更好的内部实现,并且 LogBack 内部集成了 SLF4J 可以更原生地实现一些日志记录的实现。如果说 Log4J 是手枪的话,那么 LogBack 就是步枪,大大提高了日志记录的效率。

使用 LogBack 需要首先引入依赖:

  1. <!-- LogBack -->
  2. <dependency>
  3. <groupId>ch.qos.logback</groupId>
  4. <artifactId>logback-classic</artifactId>
  5. <version>1.1.7</version>
  6. </dependency>

配置 logback.xml 配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
  4. <layout class="ch.qos.logback.classic.PatternLayout">
  5. <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
  6. </layout>
  7. </appender>
  8. <logger name="com.chanshuyi" level="TRACE"/>
  9.  
  10. <root level="debug">
  11. <appender-ref ref="STDOUT" />
  12. </root>
  13. </configuration>

LogBack 的日志级别区分可以细分到类或者包,这样就可以使日志记录变得更加灵活。之后在类文件中引入Logger类,并进行日志记录:

  1. import org.slf4j.Logger;
  2. import org.slf4j.LoggerFactory;
  3.  
  4. /**
  5. * LogBack Demo
  6. */
  7. public class LogBack {
  8. static final Logger logger = LoggerFactory.getLogger(LogBack.class);
  9. public static void main(String[] args) {
  10. logger.trace("Trace Level.");
  11. logger.debug("Debug Level.");
  12. logger.info("Info Level.");
  13. logger.warn("Warn Level.");
  14. logger.error("Error Level.");
  15. }
  16. }

输出结果:

  1. 14:34:45.747 [main] TRACE com.chanshuyi.LogBack - Trace Level.
  2. 14:34:45.749 [main] DEBUG com.chanshuyi.LogBack - Debug Level.
  3. 14:34:45.749 [main] INFO com.chanshuyi.LogBack - Info Level.
  4. 14:34:45.749 [main] WARN com.chanshuyi.LogBack - Warn Level.
  5. 14:34:45.749 [main] ERROR com.chanshuyi.LogBack - Error Level.

但掌握了上面几种日志记录组件还不够,有时候一些项目因为各种原因使用的是LOG4J记录组件,代码中写了许多LOG4J方式的代码。此时如果要转到LogBack日志组件方式就会很痛苦,我们总不能把之前所有的日志代码方法都改一下吧。这时候就可以用各种日志转接包,将JDKLog、LOG4J统一使用LogBack 输出。这就是下一篇要说的:2.日志组件的统一门面

参考资料:

[1]Log4j – Configuring Log4j 2 - Apache Log4j 2. [DB/OL]. https://logging.apache.org/log4j/2.x/manual/configuration.html, 2016-07-15

[2]Reasons to prefer logback over log4j. [DB/OL]. http://logback.qos.ch/reasonsToSwitch.html, 2016-07-15

[3]How to setup SLF4J and LOGBack in a web app - fast. [DB/OL]. https://wiki.base22.com/display/btg/How+to+setup+SLF4J+and+LOGBack+in+a+web+app+-+fast, 2016-07-15

五分钟秒懂Java日志组件的更多相关文章

  1. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  2. Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新

    Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...

  3. java日志组件介绍(common-logging,log4j,slf4j,logback )

    转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...

  4. 转:java日志组件介绍(common-logging,log4j,slf4j,logback )

    原网址:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging common-logging是 ...

  5. 【转】java日志组件介绍(common-logging,log4j,slf4j,logback )

    common-logging common-logging是apache提供的一个通用的日志接口.用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, comm ...

  6. 算法笔记_105:蓝桥杯练习 算法提高 上帝造题五分钟(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 第一分钟,上帝说:要有题.于是就有了L,Y,M,C 第二分钟,LYC说:要有向量.于是就有了长度为n写满随机整数的向量 第三分钟,YUHC ...

  7. Java日志组件2---Log4j(org.apache.log4j.Logger)

    如果我们在项目中,需要记录的东西并不多,而且也不需要有太多区分,使用jdk的自带Log完全可以解决问题.但是,在开发的过程中,大多数项目都比较大,为方便找到程序的bug,都是需要系统的记录日志的.这里 ...

  8. 2015第30周四Java日志组件

    Java 日志 API 从功能上来说,日志 API 本身所需求的功能非常简单,只需要能够记录一段文本即可.API 的使用者在需要进行记录时,根据当前的上下文信息构造出相应的文本信息,调用 API 完成 ...

  9. Java面向对象笔记(五分钟秒懂)

    面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...

随机推荐

  1. &与&& C语言

    &是一个位运算符,就是将两个二进制的数逐位相与,就是都是1才是1,只要有一个为0则为0,结果是相与之后的结果.&&是一个逻辑运算符,就是判断两个表达式的真假性,只有两个表达式同 ...

  2. BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)

    直接双端队列模拟,完了= = CODE: #include<cstdio>#include<algorithm>#include<iostream>#include ...

  3. github fork, star and watch

    1 git fork git clone原版本的话,只有读权限,是不能直接把修改提交到服务器的. git fork会创建一个副本,然后就可以在这个上面进行开发了,开发了之后可以通过pull reque ...

  4. unity3d为什么会有三种脚本语言?

    相信这个问题多多少少会令许多初学者感到困惑,因为他们不知道应该选择哪种语言好,但是都会从以下几个方面进行考虑: 1.学习成本.哪门语言让我快速上手. 2.文档帮助.说白了就是出了问题,有没有人能解决. ...

  5. Linux Bash Shell入门教程

    Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...

  6. 了解 : 多个Http请求设计方向 (batch)

    之前都是一个restful的请求,每次只能ajax一个资源,但是遇到比较多个请求时,都是用RPC来完成,但是却让后台开了许多接口,代码开始不整齐!当然roll back只能交给RPC来负责. 游览器没 ...

  7. 《学习记录》ng2-bootstrap中的component使用教程

    前序: 现在angular2已经除了集成的angular-cli,建议大家可以基于这个来快速开发ng2的项目,不用自己再搭建环境: 相关内容请前往:https://angular.cn/docs/ts ...

  8. 自定义cell设置现价,原价(加横线)

    原价,现价分别是连个label.这两个label不能直接限制死他们的宽度,因为他们的宽度不确定,而由于lable的特殊性,不设置它的宽度约束时,宽度取决于文字的内容,所以两个lable的约束设置好一些 ...

  9. Http远程调用服务

    GET public static string GetJsonStr(string webApi)        {            string serviceAddress = webAp ...

  10. 每天一个Linux命令 1

    nl命令在Linux系统中用来计算文件中行号.nl可以将输出的文件内容自动的加上行号!其默认的结果与cat -n有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动补齐0等等的功能. 1 ...