JAVA 开发中,一个离不开的东西就是日志,当在本地开发时,想要找到一些引起BUG 的问题点,我们可以通过DEBUG的形式,但是一旦项目上线,我们可能就没办法直接追踪问题,这时就需要一些工具帮我们把项目运行中一些数据打印保存下来,方便问题分析定位。
没有日志框架怎么办
记得刚开始开发JAVA 时,我们一定都用过System.out.println()做过打印的事情,其实,这样也不是不可以,但是一个日志框架要做的,其实并不只是打印输出数据,他可能还需要具有以下一些功能
- 可以持久化,无论是磁盘文件,还是数据库等
- 如果是持久化到磁盘文件,可以自定义分割,比如超过10M自动分割,防止单个日志文件过大。
- 可以控制输出级别。比如有些日志我只要在测试环境的时候才打印,而正式上线,则不打印。
还有一点,因为System.out.println() 底层是用到了synchronized 关键字,可能会导致一些性能问题
常见的日志框架
JAVA 开发中,大家也一定用到很多日志框架,常见的主要有以下这些。
- JDKLog
- Log4J
- LogBack
- SLF4J
JDKLog
JDKLog 是JDK自带的日志框架,不需要引入任何的第三方包就可以直接使用,使用方法如下
import java.util.logging.Logger;
Logger logger = Logger.getLogger("JDKLog");
logger.info("Hello World.");
运行后输出
Log4J
Log4J 是Apache基金开源的日志框架,他可以实现控制日志输出目的地,控制输出格式等等。
Log4J 实际上分了Log4J 和 Log4J2,下面演示下Log4J的使用方法
先引入相关包
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
然后项目中使用
import org.apache.log4j.Logger;
Logger logger = Logger.getLogger(JLog.class);
logger.info(" info ");
logger.debug(" debug ");
logger.error(" error ");
但是如果直接是在普通的maven 项目中使用,可能会出现如下错误:
log4j:WARN No appenders could be found for logger (log.JLog).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
因为log4j 需要配置一些东西才可以,我们可以在项目的resources目录下建立 log4j.properties文件,然后
写入如下配置
log4j.rootLogger=ALL, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
这样,就可以顺利打印了,结果如下
LogBack
LogBack 是在log4j 之后的一个日志框架,实际上是同一个人开发的,主要是重写了内核,比log4j在性能上更加的好,以下介绍摘自百度百科:
Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能
使用方法如下:
先引入依赖
<!--这个依赖直接包含了 logback-core 以及 slf4j-api的依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Logger log = LoggerFactory.getLogger(JLog.class);
log.info("info");
log.debug("debug");
log.error(" error ");
SLF4J
SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统,他主要解决的问题场景如下,假如系统今天采用了A日志框架,过了2天由于特殊原因,需要切换到B日志框架,那如果没有这个门面,则需要更改所有的日志代码,而有了这个门面,项目中直接使用门面来输入日志,则切换时没有影响,不需要改变任何代码,只需要引入新的依赖,做一个配置即可。
常用的日志级别
- OFF 关闭:最高级别,不输出日志。
- FATAL 致命:输出非常严重的可能会导致应用程序终止的错误。
- ERROR 错误:输出错误,但应用还能继续运行。
- WARN 警告:输出可能潜在的危险状况。
- INFO 信息:输出应用运行过程的详细信息。
- DEBUG 调试:输出更细致的对调试应用有用的信息。
- TRACE 跟踪:输出更细致的程序运行轨迹。
- ALL 所有:输出所有级别信息