【日志技术】JUL(java util logging)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 【1月更文挑战第14天】JUL全称Java util Logging是java原生的日志框架,使用时不需要另外引用第三方类库,相对其他日志框 架使用方便,学习简单,能够在小型应用中灵活使用。

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

● 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,将输出内容进 行排版。

二、JUL使用:
public class TestJul {
public static void main(String[] args) {
// 1.创建日志记录器对象:
Logger logger = Logger.getLogger("com.krian.jul.TestJul");

    // 2.日志记输出:
    logger.info("hello jul !");
    logger.log(Level.INFO, "info msg");

    String name = "krian";
    Integer age = 19;

    logger.log(Level.INFO, "用户信息:{0},{1}",new Object[]{name, age});
}

}
控制台输出日志信息:

1.日志级别:
JUL中的日志级别:

  • java.util.logging.Level中定义了日志的级别:
    SEVERE(最高值)
    WARNING
    INFO (默认级别)
    CONFIG
    FINE
    FINER
    FINEST(最低值)

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

    junit
    junit
    4.13.2
    test

    使用单元测试,测试了7个日志级别但是默认只实现info以上的级别:
    @Test
    public 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");
    }
    2.自定义日志级别配置:
    @Test
    public void testLogConfig(){
    // 1.创建日志记录器对象:
    Logger logger = Logger.getLogger("com.krian.jul.TestJul");

    // 2.自定义日志级别:
    // 2.1 关闭系统默认配置:
    logger.setUseParentHandlers(false);
    // 2.2 创建handler对象:
    ConsoleHandler consoleHandler = new ConsoleHandler();
    // 2.3 创建formatter对象:
    SimpleFormatter simpleFormatter = new SimpleFormatter();
    // 2.4 关联handler和formatter:
    consoleHandler.setFormatter(simpleFormatter);
    logger.addHandler(consoleHandler);
    // 2.5 设置日志级别:
    logger.setLevel(Level.ALL);
    consoleHandler.setLevel(Level.ALL);

    FileHandler fileHandler;
    // 3.配置输出文件到磁盘目录位置:
    try {

      fileHandler = new FileHandler("data\\log\\jul.log"); // Junit方法:获取的路径是在当前工程的module下
      fileHandler.setFormatter(simpleFormatter);
      logger.addHandler(fileHandler);
    

    } catch (IOException e) {

      e.printStackTrace();
    

    }

    // 4.日志输出:
    logger.severe("severe");
    logger.warning("warning");
    logger.info("info");
    logger.config("config");
    logger.fine("fine");
    logger.finer("finer");
    logger.finest("finest");
    }
    九月 05, 2022 9:20:36 上午 com.krian.jul.TestJul testLogConfig
    严重: severe
    九月 05, 2022 9:20:36 上午 com.krian.jul.TestJul testLogConfig
    警告: warning
    九月 05, 2022 9:20:36 上午 com.krian.jul.TestJul testLogConfig
    信息: info
    九月 05, 2022 9:20:36 上午 com.krian.jul.TestJul testLogConfig
    配置: config
    九月 05, 2022 9:20:36 上午 com.krian.jul.TestJul testLogConfig
    详细: fine
    九月 05, 2022 9:20:36 上午 com.krian.jul.TestJul testLogConfig
    较详细: finer
    九月 05, 2022 9:20:36 上午 com.krian.jul.TestJul testLogConfig
    非常详细: finest

Grep Console——控制台日志显示不同颜色
3.Logger之间的父子关系:
JUL中Logger之间存在父子关系,这种父子关系通过树状结构存储,JUL在初始化时会创建一个顶层 RootLogger作为所有Logger父Logger,存储上作为树状结构的根节点。并父子关系通过路径来关联。
@Test
public void testLogParent() throws Exception {
// 日志记录器对象父子关系
Logger logger1 = Logger.getLogger("com.krian.jul"); // 子
Logger logger2 = Logger.getLogger("com"); // 父
System.out.println(logger1.getParent() == logger2);

// 所有日志记录器对象的顶级父元素class为java.util.logging.LogManager$RootLogger name为 ""
System.out.println("logger2 parent:" + logger2.getParent() + ",name:" +
        logger2.getParent().getName());

// 一、自定义日志级别
// a.关闭系统默认配置
logger2.setUseParentHandlers(false);
// b.创建handler对象
ConsoleHandler consoleHandler = new ConsoleHandler();
// c.创建formatter对象
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.进行关联
consoleHandler.setFormatter(simpleFormatter);
logger2.addHandler(consoleHandler);
// e.设置日志级别
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");

}

4.JUL日志配置文件:
配置文件信息:

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

RootLogger 顶级父元素指定的默认处理器 使用的处理器(获取时设置)

handlers=java.util.logging.ConsoleHandler

RootLogger 日志等级

.level=ALL

向控制台输出的 handler 控制器:

输出日志级别

java.util.logging.ConsoleHandler.level=ALL

输出日志格式

java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter

指定 handler 对象的字符集

java.util.logging.ConsoleHandler.encoding=UTF-8

文件处理器

输出日志级别

java.util.logging.FileHandler.level=ALL

输出日志格式

java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter

java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter

输出日志文件路径

java.util.logging.FileHandler.pattern=/NettyProject/NettyStudyProject/data/log/java%u.log

输出日志文件限制大小(50000字节)

java.util.logging.FileHandler.limit = 50000

输出日志文件限制个数

java.util.logging.FileHandler.count = 10

输出日志文件 是否是追加

java.util.logging.FileHandler.append=true

自定义Logger(两个可选择:ConsoleHandler,FileHandler)

com.krian.handlers=java.util.logging.FileHandler,java.util.logging.ConsoleHandler

自定义Logger日志等级

com.krian.level=ALL

忽略父日志设置(关闭默认配置)

com.krian.useParentHandlers=false
@Test
public void testProperties() throws IOException {
// 1.读取配置文件:
InputStream inputStream = TestJul.class.getClassLoader().getResourceAsStream("logging.properties");

// 2.获取日志管理器对象:
LogManager logManager = LogManager.getLogManager();

// 3.通过日志管理器对象加载配置文件:
logManager.readConfiguration(inputStream);

// 4.获取日志记录器对象:
Logger logger = Logger.getLogger("com.krian");

logger.severe("severe test");
logger.warning("warning test");
logger.info("info test");
logger.config("config test");
logger.fine("fine test");
logger.finer("finer test");
logger.finest("finest test");

}

5.日志原理解析:

  1. 初始化LogManager
    a. LogManager加载logging.properties配置
    b. 添加Logger到LogManager
  2. 从单例LogManager获取Logger
  3. 设置级别Level,并指定日志记录LogRecord
  4. Filter提供了日志级别之外更细粒度的控制
  5. Handler是用来处理日志输出位置
  6. Formatter是用来格式化LogRecord的
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 监控 安全
单位网络监控软件:Java 技术驱动的高效网络监管体系构建
在数字化办公时代,构建基于Java技术的单位网络监控软件至关重要。该软件能精准监管单位网络活动,保障信息安全,提升工作效率。通过网络流量监测、访问控制及连接状态监控等模块,实现高效网络监管,确保网络稳定、安全、高效运行。
80 11
|
2月前
|
XML Java 编译器
Java注解的底层源码剖析与技术认识
Java注解(Annotation)是Java 5引入的一种新特性,它提供了一种在代码中添加元数据(Metadata)的方式。注解本身并不是代码的一部分,它们不会直接影响代码的执行,但可以在编译、类加载和运行时被读取和处理。注解为开发者提供了一种以非侵入性的方式为代码提供额外信息的手段,这些信息可以用于生成文档、编译时检查、运行时处理等。
83 7
|
3月前
|
Java
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
java小工具util系列5:java文件相关操作工具,包括读取服务器路径下文件,删除文件及子文件,删除文件夹等方法
113 9
|
2天前
|
JavaScript 安全 Java
智慧产科一体化管理平台源码,基于Java,Vue,ElementUI技术开发,二开快捷
智慧产科一体化管理平台覆盖从备孕到产后42天的全流程管理,构建科室协同、医患沟通及智能设备互联平台。通过移动端扫码建卡、自助报道、智能采集数据等手段优化就诊流程,提升孕妇就诊体验,并实现高危孕产妇五色管理和孕妇学校三位一体化管理,全面提升妇幼健康宣教质量。
28 12
|
6天前
|
XML JSON Java
Java中Log级别和解析
日志级别定义了日志信息的重要程度,从低到高依次为:TRACE(详细调试)、DEBUG(开发调试)、INFO(一般信息)、WARN(潜在问题)、ERROR(错误信息)和FATAL(严重错误)。开发人员可根据需要设置不同的日志级别,以控制日志输出量,避免影响性能或干扰问题排查。日志框架如Log4j 2由Logger、Appender和Layout组成,通过配置文件指定日志级别、输出目标和格式。
|
3月前
|
SQL Java 索引
java小工具util系列2:字符串工具
java小工具util系列2:字符串工具
171 83
|
2月前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
649 8
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
2月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
1341 1
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
1月前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
3月前
|
Java 数据库
java小工具util系列1:日期和字符串转换工具
java小工具util系列1:日期和字符串转换工具
76 26

热门文章

最新文章