Java日志框架——SLF4j

99 阅读11分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第7天,点击查看活动详情

👨‍🎓作者:Java学术趴

🏦仓库:GithubGitee

✏️博客:CSDN掘金InfoQ云+社区

💌公众号:Java学术趴

🚫特别声明:原创不易,未经授权不得转载或抄袭,如需转载可联系小编授权。

🙏版权声明:文章里的部分文字或者图片来自于互联网以及百度百科,如有侵权请尽快联系小编。微信搜索公众号Java学术趴联系小编。

☠️每日毒鸡汤:这个社会是存在不公平的,不要抱怨,因为没有用!人总是在反省中进步的!

Java日志框架

1. Java日志介绍

  • Java日志框架内中的xml配置文件中的标签是固定的,不可以自定义

  • 配置文件基本结构:

    以标签开头,

    包含0或多个子标签,

    包含0或多个标签,

    最多只能有一个标签。

image-20210909160501355

以下是SLF4J门面技术。

这个是SLF4J门面技术这个深绿色的代表网络适配器。

  • 日志文件是用于记录系统操作事件的文件集合。
  • 日志文件他具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。
  • 日志主要分为两种:调试日志与系统日志(工作中大部分使用)
// 使用反射机制的这个类只要是该项目的 src下的类都可以。
Logger logger = LogManager.getLogger(入门案例.class);
复制代码

1.1 调试日志

  • 我们平时使用的debug功能只能暂时查看运行信息,而不能长期的保存这些运行信息。而调试日志可以更加方便的“重新”这些问题,即可以保存这些运行信息。

1.2 系统日志

  • 系统日志是用来记录系统中的硬件、软件和系统相关问题的信息。同时还可以监视系统中发生的事件。用户可以通过它来检查错误发生的原因,或者寻找收到攻击留下来的痕迹。
  • 系统日志包括系统日志、应用日志和安全日志几种。

2.日志框架

2.1 日志框架的作用

  • 控制日志输出的内容和格式。
  • 控制日志输出的位置。
  • 日志文件相关的优化,如异步操作、归档、压缩。
  • 日志系统的维护。
  • 面向接口开发——日志的门面。

2.2 日志框架的价值

  • 我们可以直接使用别人写好的日志框架,提高开发效率。

2.3 市面流行的日志框架

  • JUL:java util logging Java原生日志框架。
  • Log4j:Apache的一个开源项目。
  • Logbcak :由Log4j之父做的另一个开源项目,业界中称为 log4j 后浪。他是一个可靠、通用且灵活的Java日志框架。
  • Log4j2 :Log4j的第二个版本,各个方面与Logback及其相似。具有插件式结构、配置文件优化等特征,在Spring Boot1.4版本之后就不在支持 log4j ,所以出现了第二个版本的。
  • JCL
  • SLF4j

2.4 日志门面和日志框架的区别

  • 日志框架技术 :JUL、Log4j、Logbcak、Log4j2
  • 日志门面技术 :JCL、SLF4j

为什么要使用日志门面技术:

  • 每一种日志框架都有自己单独的API,要使用对应的框架就要使用对应的API,这就大大的增加了应用程序代码对于日志框架的耦合性。使用日志门面技术之后,不论底层是什么日志框架,我们拿到代码之后可以使用自己习惯的日志框架就行解读,不用修改一行代码。

image-20210901205346469

  • 其实框架1调用的是自己的方法a() ,框架2调用的自己的方法b() ,此时将这两个方法抽取出来称为方法c();

3. JUL

3.1 JUL 简介

  • JUL全程 Java Util Logging,它是java原生的日志框架,使用时不需要另外引入第三方的类库,相对于其他的框架使用方便,学习简单,主要使用在小型应用中。

3.2 JUL 组件介绍

3.3 日志的级别(Level)

  • 注意:其中包含这个800,也就是info
  • info是默认的打印信息级别。
Logger logger = Logger.getLogger("com.yunbocheng.JUL.JULTest.test01");
logger.severe("severe信息");
logger.warning("warining信息");
logger.info("info信息");
logger.config("config信息");
logger.fine("fine信息");
logger.finer("finer信息");
logger.finest("finest信息");
复制代码

此时打印的结果是 :只有info级别以及比info级别高的日志信息

3.4 入门案例

  • 见项目 “入门以及默认级别展示” 。

3.5 自定义日志级别

  • 见项目 “自定义日志级别 ”

总结 :

  • 用户使用Logger来进行日志的记录,Logger可以同时持有多个处理器Handler。(同时在控制台和自定义位置进行日志信息的输出)
  • 日志的记录使用的是Logger,日志的输出使用的是Handler。
  • 添加了哪些handler对象,就相当于需要根据所添加的handler将日志信息输出到指定的位置上,例如:控制台、指定位置文件.....

3.6 JUL Logger中的父子关系。

  • 见项目”JUL中的父子关系“

3.7 JUL配置文件解析

  • 见项目”JUL配置文件“
以上所有的配置相关的操作,都是一Java硬编码的形式进行的。
我们可以使用更加清晰,更加专业的一种做法,就是配置文件。
如果我们没有自己添加这个配置文件,则会使用系统默认的配置文件。

这个配置文件:
 java.home --> 找到jre文件夹 --> lib --> logging.properties
复制代码

配置文件中的#代表的注释,可以删除掉。

3.8 自定义配置文件

  • 我们将配置文件修改为自定义的输出级别

  • 如果想要获取到这个自定义的配置文件,此时一定需要一个输入流来读取这个文件。项目见”JUL配置文件“

3.9 日志信息的追加

  • 只需要在日志配置文件中加入 :java.util.logging.FileHandler.append = true

3.10 JUL日志框架使用方式总结(原理解析)

4. Log4j

4.1 Log4j简介

  • Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、CUI组件,甚至可以是套接口服务器、NT的事件记录器。只要是我们需要的地方,一般都可以输出日志信息。
  • 我们可以控制每一条日志信息输出的格式。
  • 通过定义每一条日志信息的级别,我们能够更加细致的控制日志的生成过程。
  • 这些设置可以通过一个配置文件来灵活的进行配置,而不需要修改应用的代码。
  • Log4j --> Log for java
  • 我们使用log4j技术,主要使用的是其配置文件,我们也可以使用硬代码的格式在Java中来写这个日志配置信息。
  • 从时间上讲,log4j的产生时间要比JUL早。

4.2 Log4j组件

4.3 日志输出格式说明

4.4 Log4j的级别

  • 其中 debug 是我们在没有进行设置的情况下,默认的日志输出级别。

4.5 配置文件

  • 将项目中的项目”配置文件“

image-20210905195941294

4.6 使用默认配置文件打印日志

  • 代码在项目“配置文件”中
  • 注意:这个日志配置文件必须在main-->rescoures文件下,且名字必须是log4j.properties文件。此时log4j日志文件会自动加载这个配置文件。
  • 注意:在properties配置文件中,每一条命令后不要加分号,否则会报错。
# 以下是配置文件的代码信息
# 这行代码代表让这个日志执行指定的配置信息
# 这个trace代表的是输出级别,这个console是我们自定义的一个名称(见名思意)appenderName
# 这个可以设置打印到多个地方,中间用逗号隔开。
# 这个Logger是继承的根节点rootLogger。
log4j.rootLogger = trace,console
#配置appender输出方法
log4j.appender.console = org.apache.log4j.ConsoleAppender
#配置输出信息的格式
log4j.appender.console.layout = org.apache.log4j.SimpleLayout
复制代码
  • 以上使用的是默认的日志信息打印格式。(SimpleLayout)
// 以下是输出日志信息的代码
public void test01(){
    Logger logger = Logger.getLogger(配置文件.class);
    // 打印输出信息
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}
复制代码

4.7 自定义配置打印日志信息格式

  • 代码在项目“配置文件”中
#这行代码的代表打印到控制台
log4j.rootLogger = trace,console
#配置appender输出位置
log4j.appender.console = org.apache.log4j.ConsoleAppender
#配置输出信息的格式
log4j.appender.console.layout = org.apache.log4j.PatternLayout
#这行是设置自定义的日志信息打印格式
log4j.appender.console.layout.conversionPattern = [%p]%r %c%t%d{yyyy-mm-dd HH:mm:ss:SSS}
复制代码
  • 这个是使用的自定义日志信息打印格式 PatternLayout,这个时候只需要在默认的配置文件中加入一行指定打印日志信息格式的代码即可。

4.8 将日志输出到指定文件中的配置

  • 源代码见项目“日志信息输出到文件”
#这行代码的代表打印到控制台
log4j.rootLogger = trace,file
#配置appender输出位置
log4j.appender.file = org.apache.log4j.ConsoleAppender
#配置输出信息的格式
log4j.appender.console.file = org.apache.log4j.PatternLayout
#这行是设置自定义的日志信息打印格式
log4j.appender.file.layout.conversionPattern = [%p]%r %c%t%d{yyyy-mm-dd HH:mm:ss:SSS} %m%n
#第一个file是我们自己命名的appenderName,第二个file是用来指定文件的位置。
log4j.appender.file.file = E://log4j.log
#设置输出日志的编码格式(输出中文的日志信息)
log4j.appender.file.encoding = UTF-8
复制代码
  • 此时这个日志信息会输出到这个指定位置的文件中。

4.9 将日志信息输出到多个位置

  • 源代码见项目“日志信息输出到文件”
  • 同时输入到控制台和指定文件中
# 需要将以上输出到控制台和文件的代码都要写上
# 最主要的是修改打印到的位置代码,这是代表可以在 appenderName 为这个两个的地方输出
# 这个 file,console是我们自定义的名称,(见名思意原则就是代表控制台和文件)
log4j.rootLogger = trace,file,console
复制代码

4.10 根据文件大小拆分配置文件(RollingFileAppender)

  • 源代码见项目“日志信息输出到文件”
log4j.rootLogger = trace,rollingFile,console
# RollingFileAppender的配置,我们可以针对实际含义起名
log4j.appender.rollingFile = org.apache.log4j.RollingFileAppender
log4j.appender.rollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.rollingFile.layout.conversionPattern = [%p]%r %c%t%d{yyyy-mm-dd HH:mm:ss:SSS} %m%n
log4j.appender.rollingFile.file = E://log4j.log
log4j.appender.rollingFile.encoding = UTF-8
# 指定日志文件的大小
log4j.appender.rollingFiler.maxFileSize = 1MB
# 指定日志文件的数量
log4j.appender.rollingFiler.maxBackupIndex = 5
复制代码

  • 这个时候日志6会覆盖掉日志1。以下就是生成的5个文件。这5个文件会以序号进行排列。

4.11 根据时间来拆分日志文件(DailyRollingFileAppender)

  • 源代码见项目“日志信息输出到文件”
  • 这个会根据你输入的时间间隔来生成新的日志信息,这个时间可以是一天,也可以是一秒,需要注意的是这个并不是自动为我们生成新的日志文件,是我们手动生成的日志文件,比如:你设置的间隔是 yyyy-MM-dd ,这个时候如果你现在输出了一个日志文件,那么在这个时间开始的后24个小时内都不会生成新的日志文件,在这24小时内输出的日志文件都会存储到这个一个旧的日志文件中。即使过了24个小时,系统也不会为我们自动生成一个新的日志文件,需要程序员自己生成一个新的日志文件,加可以精确到秒,那么一秒就会为我们生成一个新的日志文件。
# DailyRollingFileAppender的配置,我们可以针对实际含义起名
log4j.appender.dailyRollingFile = org.apache.log4j.DailyRollingFileAppender
log4j.appender.dailyRollingFile.layout = org.apache.log4j.PatternLayout
log4j.appender.dailyRollingFile.layout.conversionPattern = [%p]%r %c%t%d{yyyy-mm-dd HH:mm:ss:SSS} %m%n
log4j.appender.dailyRollingFile.file = E://log4j.log
log4j.appender.dailyRollingFile.encoding = UTF-8
#不要忘记前边的那个点
appender.dailyRollingFile.datePattern = '.'yyyy-MM-dd HH:mm:ss
复制代码
  • 在这个类中没有提供覆盖的方法。

4.12 日志持久化(将日志信息存储到数据库)

  • 项目源码见 “日志持久化_将数据存储到数据库”

  • 第一步 :需要在Maven中添加mysql依赖。

  • 第二步 :在配置文件中配置连接数据库的信息并且设置插入语句。

    注意:这个插入语句必须在一行上。

# 持久化日志信息 将日志信息存储到数据库
log4j.appender.logDB = org.apache.log4j.jdbc.JDBCAppender
log4j.appender.logDB.layout = org.apache.log4j.PatternLayout
log4j.appender.logDB.Driver = com.mysql.jdbc.Driver
log4j.appender.logDB.URL = jdbc:mysql://localhost/log
log4j.appender.logDB.User = root
log4j.appender.logDB.Password = 567cybtfboys
# 此时要像数据库中插入数据,使用insert语句
log4j.appender.logDB.Sql =  INSERT INTO tab_log(id,name,create,level,category,fileName,message) values('project_log','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%m')
复制代码
  • 第三步 :在主方法中输出日志信息
Logger logger = Logger.getLogger(日志持久化_将数据存储到数据库.class);
// 输出日志信息
logger.fatal("fatal信息");
logger.error("error信息");
logger.warn("warn信息");
logger.info("info信息");
logger.debug("debug信息");
logger.trace("trace信息");
复制代码

4.13 自定义Logger的配置

  • 见项目 “自定义Logger配置”
  • 第一步 :配置自定义logger
# 使用最高父类rootLogger配置logger,这个时候继承的是父logger(根节点)
log4j.rootLogger = trace,console

# 配置自定义logger,此时使用的是自定义的父logger (自定义)
log4j.logger.com.yunbocheng = info,file
复制代码
  • 输出结果
从输出的位置来看,控制台输出了信息,日志文件也会输出信息。所以可以得出结论,如果根节点的logger和自定义父logger配置的输出位置是不同的则取二者的并集,也就是配置的位置都会进行日志的输出。

如果二者配置的日志级别不同,主要以按照我们自定义的父logger的级别输出为主。