JUL 日志 - 最简单易用的Java日志框架

在正式的生产环境下是不能使用 System.out 进行日志记录的
因为 System.out 不能提供时间、线程、执行过程 等信息,如果要手动打印输出则会非常麻烦
而日志就帮我们把这些事给干了
接下来我们学一个最简单的日志框架 JUL

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

相对其他 日志框架,JUL 功能没那么强大,但是最方便使用,因此比较适合在小型应用中使用

JUL 架构

在这里插入图片描述
Logger持有若干个Handler,日志的输出操作是由Handler完成的

在Handler在输出日志前,会经过Filter的过滤,判断哪些日志级别过滤放行哪些拦截,Handler会将日
志内容输出到指定位置(日志文件、控制台等)

JUC 使用方法

		// 创建日志记录器对象Logger logger = Logger.getLogger("JULTest");// 通用方法进行日志记录logger.log(Level.INFO, "info msg");

在log中传入日志级别和日志信息,结果如下:

在这里插入图片描述

还可以直接调用 info 级别的方法 logger.info("info msg");

还可以使用占位符做拼接

        // 1.创建日志记录器对象Logger logger = Logger.getLogger("JULTest");String name = "张三";Integer age = 18;logger.log(Level.INFO, "用户信息:{0},{1}", new Object[]{name, age});

在这里插入图片描述

JUL的日志级别

JUL可以任务有9个日志级别

查看 Level 源码:

	public static final Level OFF = new Level("OFF",Integer.MAX_VALUE, defaultBundle);public static final Level SEVERE = new Level("SEVERE",1000, defaultBundle);public static final Level WARNING = new Level("WARNING", 900, defaultBundle);public static final Level INFO = new Level("INFO", 800, defaultBundle);public static final Level CONFIG = new Level("CONFIG", 700, defaultBundle);public static final Level FINE = new Level("FINE", 500, defaultBundle);public static final Level FINER = new Level("FINER", 400, defaultBundle);public static final Level FINEST = new Level("FINEST", 300, defaultBundle);public static final Level ALL = new Level("ALL", Integer.MIN_VALUE, defaultBundle);

每个级别的 Level 都会在构造时传入一个数,并且可以看到从OFF 到ALL 这个数越来越小

  • INFO - JUL默认的日志级别是 INFO ,INFO 对应的数值为800 ,那么数值大于等于800
    的日志级别是允许被执行的,而小于800 的是不允许执行的,INFO 用于记录常规的信息,比如数据库的连接信息、 IO的传递信息 、 网络的通信信息等
  • OFF - 因此当日志界别设置为OFF 时,对应的值是Integer.MAX_VALUE ,此时不会有数值更大的日志级别,也就不会有日志执行,相当于关闭了日志
  • ALL - 当日志界别为ALL时,对应的级别为 Integer.MIN_VALUE ,此时所有的日志都会执行
  • SEVERE - 错误信息 , 输出会导致程序终止的错误信息
  • WARNING - 警告信息 , 输出异常信息,不会使程序终止,但也需要注意
  • CONFIG - 配置信息,输出配置文件的加载和读取消息等
  • FINEFINERFINEST - DeBug 日志,记录程序的运行状态、执行流程、参数传递过程等,从FINE 到 FINEST ,记录的越来越详细

JUC 配置文件

默认配置文件

如果用户不做配置,那么JUC默认会读取 jre 文件 lib 目录下的 logging.properties 配置文件

在这里插入图片描述
在该配置文件中,我们可以看到 默认使用的执行器是 ConsoleHandler ,向控制台输出日志信息

而且制定了 level 为 INFO

下面是完整的配置文件信息(删除了所有的注释),可以看到除了 ConsoleHandler ,还配置了另外一个执行器 FileHandler 的信息,只不过 handlers= java.util.logging.ConsoleHandler 中只设置了ConsoleHandler 而没有设置 FileHandler,

handlers= java.util.logging.ConsoleHandler.level= INFOjava.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatterjava.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormattercom.xyz.foo.level = SEVERE

自定义配置文件

默认控制台输出,现在我们自定义配置文件,将日志信息输出到指定的日志文件中,并把日志级别改为ALL

修改后的 logging.properties 配置文件 如下:

handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler.level= ALL## 文件处理器
# 输出日志级别
java.util.logging.FileHandler.level=ALL
# 输出日志文件路径
java.util.logging.FileHandler.pattern = D:/JULlogs/java%u.log
# 输出日志文件限制大小(50000字节)
java.util.logging.FileHandler.limit = 50000
# 输出日志文件限制个数
java.util.logging.FileHandler.count = 1
# 输出日志格式
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter## 控制台处理器
# 输出日志级别
java.util.logging.ConsoleHandler.level = ALL
# 输出日志格式
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
  • 改变了handlers,添加了 java.util.logging.FileHandler ,将配置文件读取到日志文件中
  • 改变了.level ,将日志等级改为 ALL
  • 改变了 java.util.logging.FileHandler.pattern , 指定了日志文件的文件名和生成位置

其中 java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter 指定了生成的日志文件为XML格式

我们将配置文件放到 SpringBoot下的 resources 文件下

编写一个测试类,代码如下:

public class JULTest {@Testpublic void test01() throws IOException {// 读取自定义配置文件InputStream in = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");// 获取日志管理器对象LogManager logManager = LogManager.getLogManager();// 通过日志管理器加载配置文件logManager.readConfiguration(in);Logger logger = Logger.getLogger("JULTest");logger.severe("severe");logger.warning("warning");logger.info("info");logger.config("config");logger.fine("fine");logger.finer("finer");logger.finest("finest");}}

控制台打印结果:

在这里插入图片描述
去到指定的 D:/JULlogs 文件下,发现一个 java0.log 文件,内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE log SYSTEM "logger.dtd">
<log>
<record><date>2023-08-12T14:31:36</date><millis>1691821896349</millis><sequence>0</sequence><logger>JULTest</logger><level>SEVERE</level><class>com.zhuyuanjie.springbootproject.test.JULTest</class><method>test01</method><thread>1</thread><message>severe</message>
</record>
<record><date>2023-08-12T14:31:36</date><millis>1691821896373</millis><sequence>1</sequence><logger>JULTest</logger><level>WARNING</level><class>com.zhuyuanjie.springbootproject.test.JULTest</class><method>test01</method><thread>1</thread><message>warning</message>
</record>
<record><date>2023-08-12T14:31:36</date><millis>1691821896374</millis><sequence>2</sequence><logger>JULTest</logger><level>INFO</level><class>com.zhuyuanjie.springbootproject.test.JULTest</class><method>test01</method><thread>1</thread><message>info</message>
</record>
<record><date>2023-08-12T14:31:36</date><millis>1691821896375</millis><sequence>3</sequence><logger>JULTest</logger><level>CONFIG</level><class>com.zhuyuanjie.springbootproject.test.JULTest</class><method>test01</method><thread>1</thread><message>config</message>
</record>
<record><date>2023-08-12T14:31:36</date><millis>1691821896376</millis><sequence>4</sequence><logger>JULTest</logger><level>FINE</level><class>com.zhuyuanjie.springbootproject.test.JULTest</class><method>test01</method><thread>1</thread><message>fine</message>
</record>
<record><date>2023-08-12T14:31:36</date><millis>1691821896376</millis><sequence>5</sequence><logger>JULTest</logger><level>FINER</level><class>com.zhuyuanjie.springbootproject.test.JULTest</class><method>test01</method><thread>1</thread><message>finer</message>
</record>
<record><date>2023-08-12T14:31:36</date><millis>1691821896377</millis><sequence>6</sequence><logger>JULTest</logger><level>FINEST</level><class>com.zhuyuanjie.springbootproject.test.JULTest</class><method>test01</method><thread>1</thread><message>finest</message>
</record>
</log>

当前日志文件采用覆盖方式,如果想使用追加方式,在配置文件中添加
java.util.logging.FileHandler.append=true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/33927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot汇总

文章目录 构建SpringBoot项目springboot项目启动后执行一段程序的方式Spring Boot Devtools 开发热部署springboot项目控制台打印sql日志SpringBoot定时任务之ScheduledSpringBoot使用Validation校验参数springboot中&#xff0c;日志的配置和与其他日志的兼容问题springboot错…

MDC轻量化日志链路跟踪的若干种应用场景

0x01 前言 当你的应用程序同时处理多个用户的请求时&#xff0c;你会看到日志文件或者控制台中的输出通常都是交错的&#xff0c;而非线性连续的。尤其是在分布式系统中&#xff0c;一个用户请求可能包含了若干次的服务节点调用&#xff0c;它的日志也因此变得碎片化&#xff…

数据结构:堆的实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 一、堆二、实现思路1. 结构的定义2. 堆的构建 (HeapInit)3. 堆的销毁 (HeapDestroy)4. 堆的插入 (HeapPush)5. 堆的删除 (HeapPop)6. 取堆顶的数据 (HeapTop)7. 堆的数据个数 (HeapSize…

k8s-1.22.3集群etcd备份与恢复

一、环境准备 注&#xff1a;请在测试环境下验证操作 CentOS Linux release 7.7.1908 (Core) 3.10.0-1062.el7.x86_64 kubeadm-1.22.3-0.x86_64 kubelet-1.22.3-0.x86_64 kubectl-1.22.3-0.x86_64 kubernetes-cni-0.8.7-0.x86_64 主机名IPVIPk8s-master01192.168.10.61192…

Gephi国家政策文本关键词共现矩阵的共现网络图分析

文章目录 分词jieba分词关键词提取python处理形成共现矩阵gephi导入共现矩阵过滤边的权重进行优化最终效果分词 本文研究不同文章中的关键词出现次数,因此将出现在同一篇文章中的关键词都定义为”共现”。 jieba分词 对不同后缀文件(txt、docx、pdf)进行不同处理,提取文…

RK3568开发笔记-Vendor Storage分区使用

目录 前言 一、什么是Vendor Storage分区? 二、Vendor Storage分区使用 总结 前言 在嵌入式系统开发中&#x

Dynamic Web TWAIN Crack,文档扫描SDK

Dynamic Web TWAIN Crack,文档扫描SDK Dynamic Web TWAIN用于快速部署 Web 应用程序的文档扫描 SDK&#xff0c;文档扫描SDK&#xff0c;&#xff0c;超过 5300 家公司信任 Dynamic Web TWAIN &#xff0c;因其稳健性和安全性而受到超过 5300 家公司的信赖&#xff0c;Dynamic …

Unity游戏源码分享-模拟城市搭建City Adventure

Unity游戏源码分享-模拟城市搭建City Adventure 插件如下&#xff1a; 下载地址&#xff1a; https://download.csdn.net/download/Highning0007/88191931

***is not a commit and a branch ‘***‘ cannot be created from it 报错

git执行如下代码 git checkout -b daily/1.0.0 origin/daily/1.0.0遇到报错 fatal: ‘origin/daily/1.0.27’ is not a commit and a branch ‘daily/1.0.27’ cannot be created from it 解决办法: git fetch --all原因: 报错说is not a commit而不是说branch doesn’t exis…

Webstorm + Egg.js 进行断点调试

Webstorm Egg.js 进行断点调试 1、在工具栏找到编辑配置&#xff0c;创建已运行Node.js 应用程序的调试配置 2、debug调试配置 3、调试 4、查看断点是否起效

Jenkins 修改默认管理员帐号

1、新增一个新的超级管理员用户&#xff0c;并验证能正常登录 2、进入 Jenkins 用户管理目录&#xff1a; /data/software/jenkins/users 3、修改超级管理文件夹的名称为其他名称&#xff0c;如&#xff1a;mv admin_*** ifadm_*** 4、重启Jenkins容器

PHP实现保质期计算器

1.php实现保质期计算&#xff0c; 保质期日期可选&#xff0c;天 、月、年 2. laravel示例 /*** 保质期计算器* return void*/public function expirationDateCal(){$produce_date $this->request(produce_date); // 生产日期$warranty_date $this->reques…

如何培养对技术的热爱

这篇博文主要针对计算机专业相关的同学&#xff0c;对于理工科专业的同学有一定的借鉴意义&#xff0c;对于其他专业的同学&#xff0c;还请自行取舍。 背景 初学计算机&#xff0c;可能并不是每个人都能对其产生兴趣&#xff0c;更不要说从其中获得快乐。对于如何培养兴趣&a…

02.Deep Visual-Semantic Alignments for Generating Image Descriptions

目录 前言泛读摘要IntroductionRelated Work小结 精读Model3.1 学习对齐视觉与语言数据图片表征句子表征对齐目标损失函数解码文本片段对齐图像 MRNN生成描述优化 实验结论 代码 前言 本课程来自深度之眼《多模态》训练营&#xff0c;部分截图来自课程视频。 文章标题&#xf…

(七) ElasticSearch 分词器

1.分词器 分词器是 Elasticsearch 用于将文本拆分为单词&#xff08;词项&#xff09;的组件&#xff0c;以便于搜索和索引。以下是一些关于 Elasticsearch 分词器的常见问题和相关操作的介绍&#xff1a; 1&#xff09;什么是分词器&#xff1f; 分词器是 Elasticsearch 中…

python模块 — 加解密模块rsa,cryptography

一、密码学 1、密码学介绍 密码学&#xff08;Cryptography&#xff09;是研究信息的保密性、完整性和验证性的科学和实践。它涉及到加密算法、解密算法、密钥管理、数字签名、身份验证等内容。 密码学中的主要概念包括&#xff1a; 1. 加密算法&#xff1a;加密算法用于将…

4.利用matlab符号矩阵的四则运算(matlab程序)

1.简述 符号对象的建立 sym函数 sym函数用于建立单个符号对象&#xff0c;其常用调用格式为&#xff1a; 符号对象名sym(A) 1 将由A来建立符号对象&#xff0c;其中&#xff0c;A可以是一个数值常量、数值矩阵或数值表达式(不加单引号),此时符号对象为一个符号常量&#xff1b;…

【强化学习】值函数算法DQNs详解【Vanilla DQN Double DQN Dueling DQN】

DQNs【Vanilla DQN & Double DQN & Dueling DQN】 文章目录 DQNs【Vanilla DQN & Double DQN & Dueling DQN】1. DQN及其变种介绍1.1 Vanilla DQN1.2 Double DQN1.3 Dueling DQN 2. Gym环境介绍2.1 Obseravtion Space2.2 Reward Function2.3 Action Space 3. D…

OptaPlanner笔记4

2.2.8. 创建应用程序 创建SolverFactory 来为每个数据集构建Solver加载数据集使用Solver.solve()进行求解输出数据集的解决方案 通常一个应用包含一个SolverFactory 来为每个要求解的问题数据集构建新的Solver实例。SolverFactory是线程安全的&#xff0c;但Solver不是。 im…

《树莓派项目实战》第十五节 使用L298N驱动板模块驱动双极42步进电机

目录 15.1 双极步进电机引脚介绍 15.2 连接到树莓派 15.3 编写代码驱动步进电机 在本节,我们将学习如何使用L298N驱动板驱动一个双极42步进电机。该项目涉及到的材料有: 树莓派