一、日志的概念

1. 日志文件

日志文件是用于记录系统操作事件的文件集合,可分为事件日志和消息日志。具有处理历史数据、诊断问题的追踪以及理解系统的活动等重要作用。

在计算机中,日志文件是记录在操作系统或其他软件运行中发生的事件或在通信软件的不同用户之间的消息的文件。记录是保持日志的行为。在最简单的情况下,消息被写入单个日志文件。

许多操作系统,软件框架和程序包括日志系统。广泛使用的日志记录标准是在因特网工程任务组(IETF)RFC5424中定义的syslog。syslog标准使专用的标准化子系统能够生成,过滤,记录和分析日志消息

1.1 调试日志

软件开发中,我们经常需要去调试程序,做一些信息,状态的输出便于我们查询程序的运行状况。为了让我们能够更加灵活和方便的控制这些调试的信息,所有我们需要专业的日志技术。java中寻找bug会需要重现。调试也就是debug 可以在程序运行中暂停程序运行,可以查看程序在运行中的情况。日志主要是为了更方便的去重现问题。

1.2 系统日志

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

系统日志的价值

系统日志策略可以在故障刚刚发生时就向你发送警告信息,系统日志帮助你在最短的时间内发现问题。系统日志是一种非常关键的组件,因为系统日志可以让你充分了解自己的环境。这种系统日志信息对于决定故障的根本原因或者缩小系统攻击范围来说是非常关键的,因为系统日志可以让你了解故障或者袭击发生之前的所有事件。为虚拟化环境制定一套良好的系统日志策略也是至关重要的,因为系统日志需要和许多不同的外部组件进行关联。良好的系统日志可以防止你从错误的角度分析问题,避免浪费宝贵的排错时间。另外一种原因是借助于系统日志,管理员很有可能会发现一些之前从未意识到的问题,在几乎所有刚刚部署系统日志的环境当中。

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

日志实现

JUL、logback、log4j、log4j2

3. JUL学习

JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框

架使用方便,学习简单,能够在小型应用中灵活使用。

3.1 JUL入门

3.1.1 架构介绍

  • 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.1.2 入门案例
public class JULTest {/*** jul快速入门*/@Testpublic void test() {//1 先获取日志记录器对象Logger logger = Logger.getLogger("com.tzh.JULTest");//2 日志记录输出logger.info("hello jul");//通用方法进行日志记录logger.log(Level.INFO, "ingo msg");//通过占位符方式输出变量值String name = "张三";int age = 18;logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age});}
}

3.2 日志的级别

  • java.util.logging.Level中定义了日志的级别:

    • SEVERE(最高值)

    • WARNING

    • INFO (默认级别)

    • CONFIG

    • FINE

    • FINER

    • FINEST(最低值)

  • 还有两个特殊的级别:
    • OFF,可用来关闭日志记录。
    • ALL,启用所有消息的日志记录。

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

/**
* 日志级别
*/
@Test
public void test1() {//1 获取日志记录器Logger logger = Logger.getLogger("com.tzh.JULTest");//2 日志记录输出logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");//默认输出级别为info
}

自定义日志级别配置

/*** 自定义日志级别*/@Testpublic void test2() throws IOException {//1 获取日志记录器Logger logger = Logger.getLogger("com.tzh.JULTest");//一、自定义日志级别//a.关闭系统默认配置 默认输出级别为infologger.setUseParentHandlers(false);//b.创建consoleHandler 控制台输出ConsoleHandler consoleHandler = new ConsoleHandler();//c.创建格式转换器SimpleFormatter simpleFormatter = new SimpleFormatter();//d.进行关联consoleHandler.setFormatter(simpleFormatter);logger.addHandler(consoleHandler);//e.配置日志具体级别logger.setLevel(Level.ALL);consoleHandler.setLevel(Level.ALL);//创建fileHandler 文件输出FileHandler fileHandler = new FileHandler("/jul.log");fileHandler.setFormatter(simpleFormatter);logger.addHandler(fileHandler);fileHandler.setLevel(Level.FINER);//2 日志记录输出logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

3.3 Logger之间的父子关系

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

/*** logger的父子关系*/@Testpublic void test3() throws Exception {//1 获取日志记录器Logger logger = Logger.getLogger("com.tzh");Logger logger1 = Logger.getLogger("com");System.out.println(logger.getParent() == logger1);//RootLoggerSystem.out.println(logger1.getParent());logger1.setUseParentHandlers(false);//创建consoleHandler 控制台输出ConsoleHandler consoleHandler = new ConsoleHandler();//创建格式转换器SimpleFormatter simpleFormatter = new SimpleFormatter();//进行关联consoleHandler.setFormatter(simpleFormatter);logger1.addHandler(consoleHandler);//配置日志具体级别logger1.setLevel(Level.ALL);consoleHandler.setLevel(Level.ALL);//2 日志记录输出logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

3.4 日志的配置文件

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

 /*** 加载配置文件 入门*/@Testpublic void test4() throws Exception {// 读取自定义配置文件InputStream ins = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");// 获取日志管理器对象LogManager logManager = LogManager.getLogManager();// 通过日志管理器加载配置文件logManager.readConfiguration(ins);//1 获取日志记录器Logger logger = Logger.getLogger("com.tzh");//2 日志记录输出logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}

配置文件:

# RootLogger 顶级父元素指定的默认处理器为:ConsoleHandler
handlers=java.util.logging.ConsoleHandler
# RootLogger 顶级父元素默认的日志级别为 ALL
.level=ALL
# 向日志文件输出的 handler 对象
# 指定日志文件路径 /logs/java0.log
java.util.logging.FileHandler.pattern=/logs/java%u.log
# 指定日志文件的内容大小
java.util.logging.FileHandler.limit=50000
# 指定日志文件数量
java.util.logging.FileHandler.count=1
# 指定 handler 对象日志消息格式对象
java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter
# 指定以追加方式添加日志内容
java.util.logging.FileHandler.append=true
#想控制台输出的 handler 对象
# 指定 handler 对象的日志级别
java.util.logging.ConsoleHandler.level=ALL
# 指定 handler 对象的日志消息格式对象
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
# 指定 handler对象的字符集
java.util.logging.ConsoleHandler.encoding=UTF-8
com.xyz.foo.level=SEVERE
# 自定义Logger使用
com.tzh.handlers=java.util.logging.ConsoleHandler
com.tzh.level=CONFIG
#关闭默认配置
com.tzh.useParentHandlers=false

3.5 日志的原理解析

  1. 初始化LogManager

    1. LogManager加载logging.properties配置
    2. 添加Logger到LogManager
  2. 从单例LogManager获取Logger

  3. 设置级别Level,并指定日志记录LogRecord

  4. Filter提供了日志级别之外更细粒度的控制

  5. Handler是用来处理日志输出位置

  6. Formatter是用来格式化LogRecord的


--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------

--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------

日志框架(一)JUL相关推荐

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

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

  2. Java日志框架之JUL(java util logging)详解

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

  3. java日志框架(一)JUL 学习 ,这个是什么,他在代码中如何使用,一篇文章讲清楚

    这里写目录标题 JUL 是什么 JUL组件介绍 代码中如何使用(控制台输出) 日志级别 自定义输出级别 输出日志到文件(磁盘文件中) 日志对象父子关系 配置文件 使用方法总结 JUL 是什么 JUL全 ...

  4. 日志框架-1 jul与log4j与logback介绍

    背景 日志框架一直没进行过细致的梳理,对其理解仅留在基本使用的程度:周五自测小功能时暴露了技术漏洞

  5. Java日志框架简介

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

  6. 【Log】(二)Java 中的日志框架 JCL、SLF

    [Log](一)Java 中的日志框架 JUL.Log4j [Log](二)Java 中的日志框架 JCL.SLF [Log](三)Java 中的日志框架 logback.log4j2 前言 JUL ...

  7. Java日志框架日志门面介绍

    文章目录 一.日志 二.常见日志框架 历史 各大框架介绍 JUL Log4j(1999-2015) Logback(2006-?) Log4j2 Logback与Log4j2对比 三.日志门面 什么是 ...

  8. 详细SpringBoot教程之日志框架

    写在前面 鉴于有人留言说想要学习SpringBoot相关的知识,我这里打算写一个SpringBoot系列的相关博文,目标呢是想让看了这一系列博文的同学呢,能够对SpringBoot略窥门径,这一系列的 ...

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

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

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

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

最新文章

  1. 斯隆奖新晋得主宋舒然:从视觉出发,打造机器人之「眼」
  2. 处理 Oracle SQL in 超过1000 的解决方案
  3. Fragment中使用viewLifecycleOwner/getActivity/this
  4. PKUWC 2018游记
  5. 2016 EasyAR 开发者大会定档AWE,AR SDK重大升级进入倒计时
  6. ajax请求 禁用缓存,jQuery ajax缓存禁用无法正常工作?
  7. winform把所有dll打包成一个exe
  8. Makefile 基本知识
  9. 在emIDE中创建STM32项目
  10. 计组之数据运算:8、c语言之强制类型转化、数据的存储与排序(大小端、字节对齐)
  11. java swt 双屏_SWT(JFace)体验之打开多个Form
  12. div+css完成首页布局
  13. Html+Js 3D 龙卷风
  14. learn git branching
  15. ansible进阶(五)-handlers-任务发生更改时触发操作
  16. 微信小程序 09 前后端交互
  17. [IJKPLAYER]编译与DEMO运行
  18. 非遗在线商城小程序(后台PHP开发)
  19. mysql将多行结果合并
  20. python相关性分析_python实践统计学中的三大相关性系数,并绘制相关性分析的热力图...

热门文章

  1. 全中国一共有多少IP地址?Python来告诉你!
  2. python计算圆的面积和周长 青少年编程电子学会python编程等级考试二级真题解析2021年3月
  3. 2018/11/27渡课
  4. 西瓜书SVM支持向量积--超平面的基础知识
  5. Java中对于面向对象思想的理解
  6. java三大变量——静态变量、实例变量、局部变量
  7. 全面解析Android性能优化,含腾讯、阿里、百度、京东、美团、爱奇艺等大厂实战解析
  8. IDEA 护眼色设置 背景行颜色取消等设置
  9. 常用的正则表达式大全! 顶顶顶!!!!
  10. 《数据库系统概论》课程之实验三:数据控制(安全性部分)