五分钟秒懂Java日志组件
Java中有许多种日志记录方式,有些API有占位符,有些API没占位符,初学的人可能会搞不清楚这些日志组件的由来。我一开始的时候也是很懵逼的,后来一点点弄懂了于是就又了这篇文章。
在Java中进行日志记录常见有三种方式,分别是JDKLog、Log4J、LogBack。
一、JDKLog
JDKLog记录方式是JDK官方提供的一个记录日志的方式,直接在JDK中就可以使用。但JDKLog其功能比较简单,现在用的人也很少。
- import java.util.logging.Logger;
- /**
- * JDKLog Demo
- */
- public class JDKLog
- {
- public static void main( String[] args )
- {
- Logger logger = Logger.getLogger("JDKLog");
- logger.info("Hello World.");
- }
- }
二、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 包:
- <!-- Log4J -->
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-api</artifactId>
- <version>2.6.2</version>
- </dependency>
- <dependency>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>log4j-core</artifactId>
- <version>2.6.2</version>
- </dependency>
增加配置文件 log4j2.xml 放在 resource 目录下:
- <?xml version="1.0" encoding="UTF-8"?>
- <Configuration status="WARN">
- <Appenders>
- <Console name="Console" target="SYSTEM_OUT">
- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
- </Console>
- </Appenders>
- <Loggers>
- <Root level="info">
- <AppenderRef ref="Console"/>
- </Root>
- </Loggers>
- </Configuration>
<Root>节点的 level 属性表示输出的最低级别。
编写测试类:
- import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
- /**
- * Log4J Demo
- */
- public class Log4jLog {
- public static void main(String args[]) {
- Logger logger = LogManager.getLogger(Log4jLog.class);
- logger.debug("Debug Level");
- logger.info("Info Level");
- logger.warn("Warn Level");
- logger.error("Error Level");
- }
- }
运行测试类输出结果:
- 10:16:08.279 [main] INFO com.chanshuyi.Log4jLog - Info Level
- 10:16:08.280 [main] WARN com.chanshuyi.Log4jLog - Warn Level
- 10:16:08.280 [main] ERROR com.chanshuyi.Log4jLog - Error Level
如果没有配置 log4j2.xml 配置文件,那么LOG4J讲自动启用类似于下面的的配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <Configuration status="WARN">
- <Appenders>
- <Console name="Console" target="SYSTEM_OUT">
- <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
- </Console>
- </Appenders>
- <Loggers>
- <Root level="error">
- <AppenderRef ref="Console"/>
- </Root>
- </Loggers>
- </Configuration>
输出结果:
- ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.
- 11:40:07.377 [main] ERROR com.chanshuyi.Log4jLog - Error Level
如果你没有配置文件,那么控制台会输出提示你没有编写配置文件。
三、LogBack
LogBack 可以对比起 Log4J 有更快的运行速度,更好的内部实现,并且 LogBack 内部集成了 SLF4J 可以更原生地实现一些日志记录的实现。如果说 Log4J 是手枪的话,那么 LogBack 就是步枪,大大提高了日志记录的效率。
使用 LogBack 需要首先引入依赖:
- <!-- LogBack -->
- <dependency>
- <groupId>ch.qos.logback</groupId>
- <artifactId>logback-classic</artifactId>
- <version>1.1.7</version>
- </dependency>
配置 logback.xml 配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <layout class="ch.qos.logback.classic.PatternLayout">
- <Pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</Pattern>
- </layout>
- </appender>
- <logger name="com.chanshuyi" level="TRACE"/>
- <root level="debug">
- <appender-ref ref="STDOUT" />
- </root>
- </configuration>
LogBack 的日志级别区分可以细分到类或者包,这样就可以使日志记录变得更加灵活。之后在类文件中引入Logger类,并进行日志记录:
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * LogBack Demo
- */
- public class LogBack {
- static final Logger logger = LoggerFactory.getLogger(LogBack.class);
- public static void main(String[] args) {
- logger.trace("Trace Level.");
- logger.debug("Debug Level.");
- logger.info("Info Level.");
- logger.warn("Warn Level.");
- logger.error("Error Level.");
- }
- }
输出结果:
- 14:34:45.747 [main] TRACE com.chanshuyi.LogBack - Trace Level.
- 14:34:45.749 [main] DEBUG com.chanshuyi.LogBack - Debug Level.
- 14:34:45.749 [main] INFO com.chanshuyi.LogBack - Info Level.
- 14:34:45.749 [main] WARN com.chanshuyi.LogBack - Warn Level.
- 14:34:45.749 [main] ERROR com.chanshuyi.LogBack - Error Level.
但掌握了上面几种日志记录组件还不够,有时候一些项目因为各种原因使用的是LOG4J记录组件,代码中写了许多LOG4J方式的代码。此时如果要转到LogBack日志组件方式就会很痛苦,我们总不能把之前所有的日志代码方法都改一下吧。这时候就可以用各种日志转接包,将JDKLog、LOG4J统一使用LogBack 输出。这就是下一篇要说的:2.日志组件的统一门面
参考资料:
五分钟秒懂Java日志组件的更多相关文章
- 五分钟学Java:如何才能学好Java Web里这么多的技术
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...
- Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新
Java日志组件logback使用:加载非类路径下的配置文件并设置定时更新 摘自: https://blog.csdn.net/johnson_moon/article/details/7887449 ...
- java日志组件介绍(common-logging,log4j,slf4j,logback )
转自:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging是apache提供的一个通用的日志 ...
- 转:java日志组件介绍(common-logging,log4j,slf4j,logback )
原网址:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging common-logging是 ...
- 【转】java日志组件介绍(common-logging,log4j,slf4j,logback )
common-logging common-logging是apache提供的一个通用的日志接口.用户可以自由选择第三方的日志组件作为具体实现,像log4j,或者jdk自带的logging, comm ...
- 算法笔记_105:蓝桥杯练习 算法提高 上帝造题五分钟(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 第一分钟,上帝说:要有题.于是就有了L,Y,M,C 第二分钟,LYC说:要有向量.于是就有了长度为n写满随机整数的向量 第三分钟,YUHC ...
- Java日志组件2---Log4j(org.apache.log4j.Logger)
如果我们在项目中,需要记录的东西并不多,而且也不需要有太多区分,使用jdk的自带Log完全可以解决问题.但是,在开发的过程中,大多数项目都比较大,为方便找到程序的bug,都是需要系统的记录日志的.这里 ...
- 2015第30周四Java日志组件
Java 日志 API 从功能上来说,日志 API 本身所需求的功能非常简单,只需要能够记录一段文本即可.API 的使用者在需要进行记录时,根据当前的上下文信息构造出相应的文本信息,调用 API 完成 ...
- Java面向对象笔记(五分钟秒懂)
面向对象概念 面向对象三大特征:封装,继承,多态 面向对象编程(OOP,Object Oriented Programing)是相对于面向过程编程说的,之前写的代码基本都是纯的面向过程编程的,当项目复 ...
随机推荐
- &与&& C语言
&是一个位运算符,就是将两个二进制的数逐位相与,就是都是1才是1,只要有一个为0则为0,结果是相与之后的结果.&&是一个逻辑运算符,就是判断两个表达式的真假性,只有两个表达式同 ...
- BZOJ 3403: [Usaco2009 Open]Cow Line 直线上的牛(模拟)
直接双端队列模拟,完了= = CODE: #include<cstdio>#include<algorithm>#include<iostream>#include ...
- github fork, star and watch
1 git fork git clone原版本的话,只有读权限,是不能直接把修改提交到服务器的. git fork会创建一个副本,然后就可以在这个上面进行开发了,开发了之后可以通过pull reque ...
- unity3d为什么会有三种脚本语言?
相信这个问题多多少少会令许多初学者感到困惑,因为他们不知道应该选择哪种语言好,但是都会从以下几个方面进行考虑: 1.学习成本.哪门语言让我快速上手. 2.文档帮助.说白了就是出了问题,有没有人能解决. ...
- Linux Bash Shell入门教程
Linux 系统根据 "#!" 及该字串后面的信息确定该文件的类型,关于这一问题同学们回去以后可以通过 "man magic"命令 及 /usr/share/m ...
- 了解 : 多个Http请求设计方向 (batch)
之前都是一个restful的请求,每次只能ajax一个资源,但是遇到比较多个请求时,都是用RPC来完成,但是却让后台开了许多接口,代码开始不整齐!当然roll back只能交给RPC来负责. 游览器没 ...
- 《学习记录》ng2-bootstrap中的component使用教程
前序: 现在angular2已经除了集成的angular-cli,建议大家可以基于这个来快速开发ng2的项目,不用自己再搭建环境: 相关内容请前往:https://angular.cn/docs/ts ...
- 自定义cell设置现价,原价(加横线)
原价,现价分别是连个label.这两个label不能直接限制死他们的宽度,因为他们的宽度不确定,而由于lable的特殊性,不设置它的宽度约束时,宽度取决于文字的内容,所以两个lable的约束设置好一些 ...
- Http远程调用服务
GET public static string GetJsonStr(string webApi) { string serviceAddress = webAp ...
- 每天一个Linux命令 1
nl命令在Linux系统中用来计算文件中行号.nl可以将输出的文件内容自动的加上行号!其默认的结果与cat -n有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动补齐0等等的功能. 1 ...