关键词:
1. 日志的概念
日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。
2. Java日志框架
问题:
- 控制日志输出的内容和格式。
- 控制日志输出的位置。
- 日志优化:异步日志,日志文件的归档和压缩。
- 日志系统的维护。
- 面向接口开发 :日志的门面。
2.1 为什么要用日志框架
因为软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事务处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。
2.2 现有的日志框架
- JUL(java util logging)
- logback
- log4j
- log4j2
- JCL(Jakarta Commons Logging)
- slf4j( Simple Logging Facade for Java)
日志门面(抽象层):是日志实现的抽象类。有JCL、SLF4J
- JCL:当时设计时只考虑了主流的几个日志框架,而对于未来新兴框架并没有提供接口,之后随着slf4j出现就慢慢也不再使用了,最后一次版本更新停在2014年,现不再更新维护已被淘汰,不考虑使用。
- slf4j:能够统一管理所有的日志API,优秀的门面技术,并且其能够支持未来出现的新的日志框架系统并提供日志接口。Springboot推荐slf4j+logback,未来主流会是slf4j+log4j2。
日志实现:具体的日志功能实现。框架有JUL、log4j、log4j2、logback。
- JUL:JDK自带的日志实现依赖。
- logback:第三方的,Springboot默认推荐,搭配slf4j。
- log4j:Apache推出的,之后出现了Logback(性能更好),就开始慢慢被Logback取代了。
- log4j2:Apache根据Logback的设计思想推出了Log4j2,号称日志性能最好的实现技术,其本身也有日志门面只不过大多使用slf4j来作为日志门面。
3. JUL
3.1 JUL架构介绍
- Loggers:被称为记录器,应用程序通过获取Logger对象,调用其API来来发布日志信息。Logger通常时应用程序访问日志系统的入口程序。
- Appenders:也被称为Handlers,每个Logger都会关联一组Handlers,Logger会将日志交给关联Handlers处理,由Handlers负责将日志做记录。Handlers在此是一个抽象,其具体的实现决定了日志记录的位置可以是控制台、文件、网络上的其他日志服务或操作系统日志等。
- Layouts:也被称为Formatters,它负责对日志事件中的数据进行转换和格式化。Layouts决定了数据在一条日志记录中的最终形式。
- Level:每条日志消息都有一个关联的日志级别。该级别粗略指导了日志消息的重要性和紧迫,我可以将Level和Loggers,Appenders做关联以便于我们过滤消息。
- Filters:过滤器,根据需要定制哪些信息会被记录,哪些信息会被放过。
小结:用户使用Logger来进行日志记录,Logger持有若干个Handler,日志的输出操作是由Handler完成的。在Handler在输出日志前,会经过Filter的过滤,判断哪些日志级别过滤放行哪些拦截,Handler会将日志内容输出到指定位置(日志文件、控制台等)。Handler在输出日志时会使用Layout,将输出内容进行排版。
3.2 JUL入门示例
3.2.1 创建普通Maven项目,导入Junit单元测试依赖
3.2.2 编写测试代码
JULTest.java
package logs;
import org.junit.Test;
import java.util.logging.Level;
import java.util.logging.Logger;
public class JULTest
@Test
public void testQuick() throws Exception
// 1. 创建日志记录器对象, 每个记录器都有自己唯一的标识 一般是当前类的全限定类名作为标识
Logger logger = Logger.getLogger("logs.JULTest");
// 2. 日志记录输出
logger.info("hello jul");
// 3. 通用的方法进行日志的记录
logger.log(Level.INFO, "info msg");
String name = "jack";
Integer age = 18;
// 通过占位符数据变量的值
logger.log(Level.INFO, "用户信息:0 ,1", new Object[]name, age);
运行结果:
3.3 JUL日志的级别
JUL中定义的日志级别在Level当中:
下面我们来看看JUL日志的级别:
3.4 自定义日志级别配置
JULTest.java
@Test
public void testLogConfig() throws Exception
// 1.创建日志记录器对象
Logger logger = Logger.getLogger("logs.JULTest");
// 一、自定义日志级别
// a.关闭系统默认配置
logger.setUseParentHandlers(false);
// b.创建handler对象 把日志输出到控制台
ConsoleHandler consoleHandler = new ConsoleHandler();
// c.创建formatter对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.进行关联
consoleHandler.setFormatter(simpleFormatter);
logger.addHandler(consoleHandler);
// e.设置日志级别
logger.setLevel(Level.ALL);
consoleHandler.setLevel(Level.ALL);
// 二、输出到日志文件
FileHandler fileHandler = new FileHandler("./jul.log");
fileHandler.setFormatter(simpleFormatter);
logger.addHandler(fileHandler);
// 2.日志记录输出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
运行结果:
3.5 Logger之间的父子关系
JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径来关联。
测试代码:
@Test
public void testLogParent() throws Exception
// 日志记录器对象父子关系
Logger logger1 = Logger.getLogger("com.tian.log");
Logger logger2 = Logger.getLogger("com.tian");
// 返回True则表示logger1是logger2的孩子
System.out.println(logger1.getParent() == logger2);
// 所有日志记录器对象的顶级父元素 class为java.util.logging.LogManager$RootLogger name为""
System.out.println("logger2 parent:" + logger2.getParent() + ",name:" + logger2.getParent().getName());
运行结果:
3.6 日志的配置文件
默认配置文件路径:$JAVAHOME\jre\lib\logging.properties
我们现在来自定义配置文件进行测试
测试代码:
JULTest.java
@Test
public void testProperties() throws Exception
// 读取自定义配置文件
InputStream in = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
// 获取日志管理器对象
LogManager logManager = LogManager.getLogManager();
// 通过日志管理器加载配置文件
logManager.readConfiguration(in);
Logger logger = Logger.getLogger("com.tian.JULTest");
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
自定义配置文件位置
logging.properties
## RootLogger使用的处理器(获取时设置)
handlers=java.util.logging.ConsoleHandler
# RootLogger日志等级
.level=INFO
## 自定义Logger
com.tian.handlers=java.util.logging.FileHandler
# 自定义Logger日志等级
com.tian.level=INFO
# 忽略父日志设置
com.tian.useParentHandlers=false
## 控制台处理器
# 输出日志级别
java.util.logging.ConsoleHandler.level=INFO
# 输出日志格式
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
## 文件处理器
# 输出日志级别
java.util.logging.FileHandler.level=INFO
# 输出日志格式
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
# 输出日志文件路径
java.util.logging.FileHandler.pattern=C:/logs/java.log
# 输出日志文件限制大小(50000字节)
java.util.logging.FileHandler.limit=50000
# 输出日志文件限制个数
java.util.logging.FileHandler.count=1
# 输出日志文件 是否是追加
java.util.logging.FileHandler.append=false
运行结果:
java日志框架--日志框架介绍日志门面技术jul日志(jul架构jul入门示例jul日志级别jul日志的配置文件)(代码片段)
1.日志的概念日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。2.Java日志框架问题:控制日志输出的内容和格式。控制日志... 查看详情
java日志框架jul详解大全(代码片段)
文章目录JUL简介JUL架构入门示例Logger父子继承关系日志配置硬编码日志配置日志配置文件自定义Logger自定义日志格式日志过滤器JUL简介JUL(Javautillogging),Java原生日志框架,不需要引入第三方依赖包,使用简... 查看详情
java日志框架jul详解大全(代码片段)
文章目录JUL简介JUL架构入门示例Logger父子继承关系日志配置硬编码日志配置日志配置文件自定义Logger自定义日志格式日志过滤器JUL简介JUL(Javautillogging),Java原生日志框架,不需要引入第三方依赖包,使用简... 查看详情
日志框架之java原生日志框架jul(代码片段)
(日志框架之Java原生日志JUL)Java原生日志JULJUL的基本使用publicstaticvoidmain(String[]args)//获取日志记录器对象Loggerlogger=Logger.getLogger("cn.ybzy.Jul");//日志记录输出logger.info("hellojul");//通用方法进行日志记录logger.log(Level.INFO,&... 查看详情
日志技术-java原生日志实现jul
目录:一、日志的概念二、Java日志框架三、JUL日志框架四、JUL日志框架代码实现1、默认配置日志输出2、直接对应日志级别输出3、自定义编码形式日志输出4、Logger对象的父子关系5、加载自定义配置文件五、JUL日志配置文件1、JD... 查看详情
java日志框架介绍
Log4jApacheLog4j是一个基于Java的日志记录工具。它是由CekiGülcü首创的,现在则是Apache软件基金会的一个项目。Log4j是几种Java日志框架之一。 Log4j2ApacheLog4j2是apache开发的一款Log4j的升级产品。 CommonsLoggingApache基金会所属的项... 查看详情
1.1.2(日志框架)
什么是日志框架? 是一套能实现日志输出的工具包 能够描述系统运行状态的所有时间都可以算作日志. 用户上线,数据库崩溃等.日志框架的能力: 定制输出目标. 定制输出格式. 携带上下文信息. 运行时选... 查看详情
日志框架(代码片段)
1、市面上的日志框架JUL、JCL、Jboss-logging、logback、log4j、log4j2、slf4j....日志门面(日志的抽象层)日志实现JCL(JakartaCommonsLogging)SLF4j(SimpleLoggingFacadeforJava)jboss-loggingLog4jJUL(java.util.logging)Log4j2Logback &nbs 查看详情
关于log4jjuljclslf4j等等日志组件的理解
日志组件: 我们经常在开发项目的时候,需要打印记录项目过程中的一些日志。那我们经常大概会用到log4j、jul、jcl、slf4j、simple、nop、logback等等,那我们就详细介绍下这些组件是怎么做日志打印的JUL:JUL全称JavautilLogging是j... 查看详情
实现jul日志重定向到slf4j
需求背景 jul指的是java.util.logging,是java内置的日志模块,目前流行的Java日志组件还包括jcl(common-logging)、slf4j/log4j/logback等等 不同日志框架的定位和特性都存在差异,如jcl、slf4j提供的是日志门面(api)定义,log4j、logbac... 查看详情
java日志实战及解析-马如林-专题视频课程
Java日志实战及解析—7565人已学习课程介绍 介绍Java日志相关内容。从理论到实战,从实战到源码,都有涉及,全面搞定Java日志及相关库或框架。前置知识:Java基础。学习效果:全面系统掌握Java日... 查看详情
java日志框架--jcl日志门面(jcl概念介绍jcl示例)(代码片段)
1.JCL全称为JakartaCommonsLogging,是Apache提供的一个通用日志API。是日志门面的一种实现方式,另外一种日志门面的实现方式是Slf4j。它是为"所有的Java日志实现"提供一个统一的接口,它自身也提供一个日志的实现... 查看详情
java日志框架--jcl日志门面(jcl概念介绍jcl示例)(代码片段)
1.JCL全称为JakartaCommonsLogging,是Apache提供的一个通用日志API。是日志门面的一种实现方式,另外一种日志门面的实现方式是Slf4j。它是为"所有的Java日志实现"提供一个统一的接口,它自身也提供一个日志的实现... 查看详情
日志问题
日志框架常见的日志框架主要有 Apache的JCLApacheCommonsLogging-JUL ApacheCommonsLogging- Log4j(其中,JUL是JDK的类,Log4j是Apache提供的实现类) Gülcü的SLF4JSLF4J-SLF4J-nopSLF4J-SLF4J-simpleSLF4J-Logback 查看详情
java日志框架学习--logback和log4j2--下
Java日志框架学习--LogBack和Log4j2--下LogbackLogback中的组件Logback配置文件日志输出格式使用演示配置文件输出到控制台输出到控制台和文件输出到控制台,文件和html日志拆分过滤器异步日志自定义LoggerLog4jLog4j2简介Log4j2特征应用演示... 查看详情
探索java的日志世界
探索Java的日志世界本文的思维导图一、主题打开日志的大门,探索的Java日志世界二、目标了解常用的日志框架掌握日志框架的选择和使用以及开发规范了解日志框架中的一些设计思想三、内容1、日志及日志框架简介1.1、日志简... 查看详情
springboot与日志框架1(代码片段)
一、日志框架1.无论在什么系统,日志框架都是一个重要角色,所以理解和用好日志框架是相当重要的;像JDBC一样,日志框架分为接口层的门面和具体的实现组成。2.市面上的产品:2.1门面:SLF4J(SimpleLogginFacadeforJava)、JCL(JakartaCom... 查看详情
java项目日志系统的总结(代码片段)
目录日志系统归类以及关系日志的三个组件slf4j的使用项目中构建日志系统使用例子日志系统归类以及关系常用的日志框架:slf4j、logback、log4j、log4j2、JUL(javautillogging)、jboss-logging、JCL(jakartacommonlogging)log4j:最开始的一个日志系统... 查看详情