文章目录

  • 日志文件的重要性
  • 常见日志框架
  • 什么是JUL
  • JUL架构介绍
  • 入门案例
  • JUL日志级别
  • Logger之间的父子关系
  • 日志的配置文件
  • 日志原理解析

日志文件的重要性

做开发最怕的就是线上系统出问题了,轻则留下产品和系统不安全可靠的不好印象,重则影响到公司的收入和口碑。当然了,线上BUG总会存在,这很正常,但是我们要做到即使出现了问题,也要能快速定位问题修复。

常见日志框架

Log4J

Log4J是Apache开源项目,通过使用Log4J,我们可以控制日志信息输送的目的地是控制台、文件、数据库等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。当前已经停止维护,不建议使用。

Logback
Logback是由Log4J创始人设计的另一个开源日志组件它当前分为以下三个模块

  • logback-core:其它两个模块的基础模块。
  • logback-classic:它是log4j的一个改良版本,同时它完整实现了slf4j API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。
  • logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。

Log4J2

Log4j 2是对Log4J的升级,它比其前身Log4J提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题。现在最优秀的Java日志框架是Log4j2,没有之一。

今天我们先来学习一个Java原生的日志框架 后面为大家带来Log4J、Logback、Log4J2的学习

什么是JUL

JUL全称ava util Logging是Java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框架使用方便,学习简单,能够在小型应用中灵活使用。

JUL架构介绍

LoggerHandler都可设置过滤器Filter

日志靠几个组件完成

Loggers(日志记录器):Logger通常是应用程序访问日志系统的入口程序,负责捕捉事件并将其发送给何时的Appender,其关联着一组Handler。
Appenders(输出源):也称为Handlers,负责从Logger中取出日志消息,并使用Layouts(即Formatters)来格式化信息,然后将消息发送出去。一个logger可以有多个Handlers。可通过抽象类Handler下的具体实现类来决定输出位置,可输出多个位置。(控制台、文件或其他日志收集系统)
Layouts(布局器):称为Formatters,负责对日志事件中的数据进行转换和格式化,通过使用抽象类Formatter下的指定实例来决定输出格式。
Filters:过滤器,根据需要来定制哪些日志会被记录或放过

入门案例

public class JULTest {@Testpublic void testQuick() throws Exception {// 1.创建日志记录器对象Logger logger = Logger.getLogger("com.itheima.log.JULTest");// 2.日志记录输出logger.info("hello jul");// 通用方法进行日志记录logger.log(Level.INFO, "info msg");// 通过占位符方式输出变量值String name = "jack";Integer age = 18;logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age});}}

JUL日志级别

  • SEVERE(最高值)
  • WARNING INFO (默认级别)
  • CONFIG
  • 下面三个为DEBUGER级别
    • FINE
    • FINER
    • FINEST(最低值)
  • OFF可用来关闭日志记录
  • ALL 启用所有消息的日志记录

虽然我们测试了7个日志级别但是默认只实现info以上的级别

    @Testpublic void testLogLevel() throws Exception {// 1.获取日志对象Logger logger = Logger.getLogger("com.itheima.log.QuickTest");// 2.日志记录输出logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("cofnig");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

自定义日志级别配置

    @Testpublic void testLogConfig() throws Exception {// 创建日志记录器对象Logger logger = Logger.getLogger("com.itheima.log.JULTest");// 自定义日志级别// 关闭系统默认配置logger.setUseParentHandlers(false);// 创建handler对象ConsoleHandler consoleHandler = new ConsoleHandler();// 输出到控制台// 创建formatter对象SimpleFormatter simpleFormatter = new SimpleFormatter();// 进行关联consoleHandler.setFormatter(simpleFormatter);logger.addHandler(consoleHandler);// 设置日志级别logger.setLevel(Level.ALL);consoleHandler.setLevel(Level.ALL);// 输出到日志文件FileHandler fileHandler = new FileHandler("d:/logs/jul.log");fileHandler.setFormatter(simpleFormatter);logger.addHandler(fileHandler);// 日志记录输出logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

Logger之间的父子关系

JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径来关联。

@Test
public void testLogParent() throws Exception {// 日志记录器对象父子关系Logger logger1 = Logger.getLogger("com.itheima.log");Logger logger2 = Logger.getLogger("com.itheima");System.out.println(logger1.getParent() == logger2);// 所有日志记录器对象的顶级父元素 class为java.util.logging.LogManager$RootLogger name为""System.out.println("logger2 parent:" + logger2.getParent() + ",name:" + logger2.getParent().getName());// 关闭系统默认配置logger2.setUseParentHandlers(false);// 创建handler对象ConsoleHandler consoleHandler = new ConsoleHandler();// 创建formatter对象SimpleFormatter simpleFormatter = new SimpleFormatter();// 进行关联consoleHandler.setFormatter(simpleFormatter);logger2.addHandler(consoleHandler);// 设置日志级别logger2.setLevel(Level.ALL);consoleHandler.setLevel(Level.ALL);// 测试日志记录器对象父子关系logger1.severe("severe");logger1.warning("warning");logger1.info("info");logger1.config("config");logger1.fine("fine");logger1.finer("finer");logger1.finest("finest");
}

日志的配置文件

默认配置文件路径 $JAVAHOME\jre\lib\logging.properties

@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.itheima.log.JULTest");logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}
# RootLogger使用的处理器(获取时设置)
handlers= java.util.logging.ConsoleHandler
# RootLogger日志等级
.level= INFO
# 自定义Logger
com.itheima.handlers= java.util.logging.FileHandler
# 自定义Logger日志等级
com.itheima.level= INFO
# 忽略父日志设置
com.itheima.useParentHandlers=false
# 控制台处理器
# 输出日志级别
java.util.logging.ConsoleHandler.level = INFO
# 输出日志格式
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# 指定handler对象的字符集
java.util.logging.ConsoleHandler.encoding=UTF-8
# 文件处理器
# 输出日志级别
java.util.logging.FileHandler.level=INFO
# 输出日志格式
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
# 输出日志文件路径
java.util.logging.FileHandler.pattern = /java%u.log
java.util.logging.FileHandler.limit = 50000
# 输出日志文件限制个数
java.util.logging.FileHandler.count = 10
# 输出日志文件 是否是追加
java.util.logging.FileHandler.append=true

日志原理解析

初始化LogManager
LogManager加载logging.properties配置
添加Logger到LogManager
从单例LogManager获取Logger
设置级别Level,并指定日志记录LogRecord
Filter提供了日志级别之外更细粒度的控制
Handler是用来处理日志输出位置
Formatter是用来格式化LogRecord的

Java 日志框架 JUL相关推荐

  1. java日志框架JUL、JCL、Slf4j、Log4j、Log4j2、Logback 一网打尽

    为什么程序需要记录日志 我们不可能实时的24小时对系统进行人工监控,那么如果程序出现异常错误时要如何排查呢?并且系统在运行时做了哪些事情我们又从何得知呢?这个时候日志这个概念就出现了,日志的出现对系统 ...

  2. Java日志框架 -- 日志框架介绍、日志门面技术、JUL日志(JUL架构、JUL入门示例、JUL日志级别、JUL日志的配置文件)

    1. 日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断问题的追踪以及理解系统的活动等重要作用. 2. Java日志框架 问题: 控制日志输出的内容 ...

  3. Java日志框架学习--JUL和Log4j--上

    Java日志框架学习--JUL和Log4j--上 引言 日志框架 市面流行的日志框架 日志门面和日志框架的区别 JUL JUL简介 JUL组件介绍 实际使用 Logger之间的父子关系 默认配置文件位 ...

  4. 学习Java日志框架之——搞懂JUL(java.util.logging)

    文章目录 系列文章目录 一.JUL简介 二.JUL组件介绍 三.代码实例 1.入门案例 2.日志级别 (1)默认日志级别源码分析 3.自定义日志级别 4.将日志输出到文件中 5.Logger的父子关系 ...

  5. java日志框架详解

    一,日志的概念 日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志.具有处理历史数据.诊断 问题的追踪以及理解系统的活动等重要作用. 二,现有的日志框架 JUL(java util l ...

  6. Java日志框架简介

    一.java日志发展线路图 上面涵盖了java世界里主要的日志框架或门面,注意,jcl和slf4j是日志门面,因此,在slf4j之前的日志框架,要使用桥接模式来适应slf4j的通用接口,达到统一接口调 ...

  7. Java 日志框架详解

    1. JUL学习 JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框 架使用方便,学习简单,能够在小型应用中灵活使用. 1.1 架构介 ...

  8. Java日志框架学习笔记

    Java日志框架学习笔记 文章目录 0 主流Java日志框架 1 log4j 1.1 理论知识 1.1.1 Loggers日志记录器 1.1.2 Appenders输出端 1.1.3 Layout日志 ...

  9. 学习Java日志框架之——搞懂日志门面(JCL+SLF4J)

    文章目录 系列文章目录 一.什么是日志门面 1.门面模式(外观模式) 2.日志门面 二.了解JCL 1.JCL组件结构 2.JCL案例 (1)JCL默认实现 (2)导入log4j测试原有程序 三.SL ...

最新文章

  1. 使用arthas采集火焰图
  2. 3dmax批量导出fbx_推荐一款超实用的3DMAX插件——模法师
  3. java6特性_Java6的新特性
  4. 解决JSTL各种报错异常(稳准狠~!)
  5. .net core 下的HttpClient、WebClient性能测试
  6. 收好这张MySQL导图,全是知识点!
  7. java学习(167):生产者消费者问题
  8. koa-generator 快速生成 koa2 服务的脚手架工具
  9. ubuntu下搭建车场环境(代码使用jekins构建)
  10. 已解决 selenium.common.exceptions.NoSuchWindowException: Message: no such window
  11. 【作业】条件、循环、函数定义、字符串操作练习
  12. configure: error: Library requirements (libpcre >= 7.8) not met
  13. 易语言静态连接器提取_正确易语言链接器link.exe,使易语言支持静态编译
  14. python 过采样算法_欠采样(undersampling)和过采样(oversampling)会对模型带来怎样的影响?...
  15. Android——GSON解析JSON
  16. NXP LPC芯片程序下载
  17. CGI入门一:使用C++实现CGI程序
  18. ASP.Net之发展史
  19. 安卓sqlite的使用
  20. Java的在哪里找labor_LaborDay哪里玩

热门文章

  1. 我和我的CSDN高校俱乐部
  2. 传奇战士怎么玩遗弃宝塔攻略
  3. 书论56 郑杓 刘有定《衍极并注》
  4. 如何查看网站已经保存的密码
  5. Win10自带Ubuntu子系统的安装与配置
  6. WOW渲染中的纹理压缩
  7. css关于/deep/的解释和用法
  8. 人工智能研究学者影响力排名,详细说明
  9. cs学硕上岸学长的复习笔记——计算机网络狂背
  10. 分布式技术与实战第七课 高并发下高可用的熔断、降级、限流和负载均衡、监控以及统一的日志系统