JUL日志
文章目录
- JUL日志
- JUL日志讲解
- Properties配置文件
- 编写日志配置文件
- Lombok快速开启日志
- Mybatis日志系统
JUL日志
如果使用System.out.println来打印信息,项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假如我们现在希望,项目只在debug的情况下打印某些日志,而在实际运行时不打印日志,采用直接输出的方式就很难实现了,因此我们需要使用日志框架来规范化日志输出。
而JDK为我们提供了一个自带的日志框架,位于java.util.logging包下,我们可以使用此框架来实现日志的规范化打印,使用起来非常简单:
// 首先获取日志打印器
Logger logger = Logger.getLogger(Main.class.getName());
// 调用info来输出一个普通的信息,直接填写字符串即可
logger.info("我是普通的日志");
JUL日志讲解
日志分为7个级别,详细信息我们可以在Level类中查看:
- SEVERE(最高值)- 一般用于代表严重错误
- WARNING - 一般用于表示某些警告,但是不足以判断为错误
- INFO (默认级别) - 常规消息
- CONFIG
- FINE
- FINER
- FINEST(最低值)
通过info方法直接输出的结果就是使用的默认级别的日志
打印时输出日志级别:
logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误"));
logger.log(Level.WARNING, "警告的内容");
logger.log(Level.INFO, "普通的信息");
logger.log(Level.CONFIG, "级别低于普通信息");
设置配置修改日志的打印级别:
public static void main(String[] args) {Logger logger = Logger.getLogger(Main.class.getName());//修改日志级别logger.setLevel(Level.CONFIG);//不使用父日志处理器logger.setUseParentHandlers(false);//使用自定义日志处理器//默认为console处理ConsoleHandler handler = new ConsoleHandler();handler.setLevel(Level.CONFIG);logger.addHandler(handler);logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误"));logger.log(Level.WARNING, "警告的内容");logger.log(Level.INFO, "普通的信息");logger.log(Level.CONFIG, "级别低于普通信息");
}
日志处理器不仅仅只有控制台打印,也可以使用文件处理器来处理日志信息:
//添加输出到本地文件
FileHandler fileHandler = new FileHandler("test.log");
fileHandler.setLevel(Level.WARNING);
logger.addHandler(fileHandler);
控制台处理器就默认使用的是SimpleFormatter,而文件处理器则是使用的XMLFormatter,可以自定义:
//使用自定义日志处理器(控制台)
ConsoleHandler handler = new ConsoleHandler();
handler.setLevel(Level.CONFIG);
handler.setFormatter(new XMLFormatter());
logger.addHandler(handler);
直接配置为想要的打印格式:
public class TestFormatter extends Formatter {@Overridepublic String format(LogRecord record) {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");String time = format.format(new Date(record.getMillis())); //格式化日志时间return time + " : " + record.getMessage() + "\n";}
}
public static void main(String[] args) throws IOException {Logger logger = Logger.getLogger(Main.class.getName());logger.setUseParentHandlers(false);//为了让颜色变回普通的颜色,通过代码块在初始化时将输出流设定为System.outConsoleHandler handler = new ConsoleHandler(){{setOutputStream(System.out);}};//创建匿名内部类实现自定义的格式handler.setFormatter(new Formatter() {@Overridepublic String format(LogRecord record) {SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");String time = format.format(new Date(record.getMillis())); //格式化日志时间String level = record.getLevel().getName(); // 获取日志级别名称// String level = record.getLevel().getLocalizedName(); // 获取本地化名称(语言跟随系统)String thread = String.format("%10s", Thread.currentThread().getName()); //线程名称(做了格式化处理,留出10格空间)long threadID = record.getThreadID(); //线程IDString className = String.format("%-20s", record.getSourceClassName()); //发送日志的类名String msg = record.getMessage(); //日志消息//\033[33m作为颜色代码,30~37都有对应的颜色,38是没有颜色,IDEA能显示,但是某些地方可能不支持return "\033[38m" + time + " \033[33m" + level + " \033[35m" + threadID+ "\033[38m --- [" + thread + "] \033[36m" + className + "\033[38m : " + msg + "\n";}});logger.addHandler(handler);logger.info("我是测试消息1...");logger.log(Level.INFO, "我是测试消息2...");logger.log(Level.WARNING, "我是测试消息3...");
}
不希望某些日志信息被输出,配置过滤规则:
public static void main(String[] args) throws IOException {Logger logger = Logger.getLogger(Main.class.getName());//自定义过滤规则logger.setFilter(record -> !record.getMessage().contains("普通"));//为ture才输出logger.log(Level.SEVERE, "严重的错误", new IOException("我就是错误"));logger.log(Level.WARNING, "警告的内容");logger.log(Level.INFO, "普通的信息");
}
Properties配置文件
Properties文件是Java的一种配置文件:
name=Test
desc=Description
加载Properties配置文件:
public static void main(String[] args) throws IOException {Properties properties = new Properties();properties.load(new FileInputStream("test.properties"));System.out.println(properties);
}
Properties本质上就是一个Map一样的结构,它会把所有的配置项映射为一个Map,这样我们就可以快速地读取对应配置的值了。
将已经存在的Properties对象放入输出流进行保存:
public static void main(String[] args) throws IOException {Properties properties = new Properties();// properties.setProperty("test", "lbwnb"); //和put效果一样properties.put("test", "lbwnb");properties.store(System.out, "????");//第二个参数设置评论注释//properties.storeToXML(System.out, "????"); 保存为XML格式
}
通过System.getProperties()获取系统的参数
编写日志配置文件
配置文件来规定日志打印器的一些默认值:
# RootLogger 的默认处理器为
handlers= java.util.logging.ConsoleHandler
# RootLogger 的默认的日志级别
.level= CONFIG
# 修改ConsoleHandler的默认配置
# 指定默认日志级别
java.util.logging.ConsoleHandler.level = ALL
# 指定默认日志消息格式
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
# 指定默认的字符集
java.util.logging.ConsoleHandler.encoding = UTF-8
使用配置文件来进行配置:
public static void main(String[] args) throws IOException {//获取日志管理器LogManager manager = LogManager.getLogManager();//读取我们自己的配置文件manager.readConfiguration(new FileInputStream("logging.properties"));//再获取日志打印器Logger logger = Logger.getLogger(Main.class.getName());logger.log(Level.CONFIG, "我是一条日志信息"); //通过自定义配置文件,我们发现默认级别不再是INFO了
}
Lombok快速开启日志
添加一个@Log注解,可以直接使用一个静态变量log,而它就是自动生成的Logger
@Log(topic = "name") //手动指定名称
public class Main {public static void main(String[] args) {System.out.println("自动生成的Logger名称:"+log.getName());log.info("我是日志信息");}
}
Mybatis日志系统
开启Mybatis的日志系统,来监控所有的数据库操作
配置开启日志系统:
<setting name="logImpl" value="STDOUT_LOGGING" />
logImpl包括很多种配置项,包括 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING,而默认情况下是未配置,也就是说不打印。
设定为STDOUT_LOGGING表示直接使用标准输出将日志信息打印到控制台;JDK_LOGGING表示使用JUL进行日志打印
Mybatis的日志级别都比较低,需要设置一下logging.properties默认的日志级别
handlers= java.util.logging.ConsoleHandler
.level= ALL
java.util.logging.ConsoleHandler.level = ALL
相关文章:
JUL日志
文章目录 JUL日志JUL日志讲解Properties配置文件编写日志配置文件Lombok快速开启日志Mybatis日志系统 JUL日志 如果使用System.out.println来打印信息,项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假…...
ZZ308 物联网应用与服务赛题第G套
2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (G卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用…...
如何使用 vcpkg 编译Google-V8脚本引擎(ECMA/JavaScript)?
WIN32K下一键杀死所有同名进程命令行:taskkill /F /IM chrome.exe ############################## 1、准备 Visual Studio 2019 2、准备 Visual Studio 2022 3、安装 VC、MSBuild 编译集成环境 4、安装 Python 3.x,早期V8发行版本编译安装 2.x 5、…...
系列二十二、idea Live Templates
一、idea Live Templates 1.1、Java Group 1.1.1、fast fast 快速在类上添加注解Data AllArgsConstructor NoArgsConstructor Accessors(chain true) ToString(callSuper true) 1.1.2、getThreadName getThreadName快速获取当前线程的名字Thread.currentThread().getName…...
电脑本地安装宝塔/docker 安装宝塔
一、先去docker官网(http://docker.com)下载软件并进行安装,网站打不开多试几次或者找梯子。 二、macos系统里按“command 空格”搜索“终端”回车,启动终端程序。 三、执行下面命令,拉取docker镜像。 docker pull pch18/baota:clear pch…...
Java Lambda 表达式笔记
文章目录 Java Lambda 表达式语法Lambda 表达式实例Lambda表达式与函数式接口方法引用处理lambda表达式的接口 Java Lambda 表达式语法Lambda 表达式实例Lambda表达式与函数式接口方法引用处理lambda表达式的接口 Java Lambda 表达式 Lambda 表达式,也可称为闭包. …...
Flutter笔记:状态提升、控制器模式、GetX控制器和服务
Flutter笔记 状态提升、控制器模式、GetX控制器和服务 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1…...
9.spark自适应查询-AQE之动态调整Join策略
目录 概述动态调整Join策略原理实战 动态优化倾斜的 Join原理实战 概述 broadcast hash join 类似于 Spark 共享变量中的广播变量,Spark join 如果能采取这种策略,那join 的性能是最好的 自适应查询AQE(Adaptive Query Execution) 动态调整Join策略 原…...
CentOs7 NAT模式连接网络
1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板,找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置,对网卡VMnet8 进行设置 记住网关 全部选择应用,确定 1.3 设置…...
linux安装git
目录 声明 前言 正文 (1)下载git压缩包 (2)git压缩包解压 (3)解压完成后需要进行源码的编译操作 a.首先进去到解压后的文件目录中: b.执行: 编译的过程中可能遇到的问题&am…...
thinkphp6 起步
1、安装 composer create-project topthink/think6.0 tp62、使用多应用模式,你需要安装多应用模式扩展think-multi-app composer require topthink/think-multi-app3、config/app.php中,将 ‘auto_multi_app’ > flase, 改为true; 需要自…...
会员题-力扣408-有效单词缩写
有效单词缩写 字符串可以用 缩写 进行表示,缩写 的方法是将任意数量的 不相邻 的子字符串替换为相应子串的长度。例如,字符串 “substitution” 可以缩写为(不止这几种方法): “s10n” (“s ubstitutio n”) “sub4…...
spring-cloud-stream
系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 第七章 Spring Cloud 之 GateWay 第八章 Sprin…...
2.0 熟悉CheatEngine修改器
Cheat Engine 一般简称为CE,它是一款功能强大的开源内存修改工具,其主要功能包括、内存扫描、十六进制编辑器、动态调试功能于一体,且该工具自身附带了脚本工具,可以用它很方便的生成自己的脚本窗体,CE工具可以帮助用户…...
微信小程序数据交互和缓存
目录 前言: 数据交互 1. 发起网络请求 2. WebSocket 2.1实时数据库 3. 微信支付 数据缓存 1. 页面级缓存 2. 内存级缓存 3. 数据缓存策略 优化用户体验 总结 前言: 在开发微信小程序时,数据交互和缓存是非常重要的方面。本文将介…...
kubernetes集群编排——k8s认证授权
pod绑定sa [rootk8s2 ~]# kubectl create sa admin [rootk8s2 secret]# vim pod5.yaml apiVersion: v1 kind: Pod metadata:name: mypod spec:serviceAccountName: admincontainers:- name: nginximage: nginxkubectl apply -f pod5.yamlkubectl get pod -o yaml 认证 [rootk8s…...
rabbitmq下载安装教程
1.首先需要下载erlang和rabbitmq安装包: 官网下载比较慢,通过网盘下载: 链接:https://pan.baidu.com/s/1fM2BrJqefyzUDZD4tfZLIg 提取码:5hsu 2.安装,傻瓜式安装就可以,可以自定义自己要安装的目…...
数据分析实战 | SVM算法——病例自动诊断分析
目录 一、数据分析及对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型应用及评价 一、数据分析及对象 CSV文件——“bc_data.csv” 数据集链接:https://download.csdn.net/download/m0_70452407/88…...
Splunk Connect for Kafka – Connecting Apache Kafka with Splunk
1: 背景: 1: splunk 有时要去拉取kafka 上的数据: 下面要用的有用的插件:Splunk Connect for Kafka 先说一下这个Splunk connect for kafka 是什么: What is Splunk Connect for Kafka? Spunk Connect for Kafka is a “sink connector” built on the Kafka Connect…...
Unity | Shader(着色器)和material(材质)的关系
一、前言 在上一篇文章中 【精选】Unity | Shader基础知识(什么是shader)_unity shader_菌菌巧乐兹的博客-CSDN博客 我们讲了什么是shader,今天我们讲一下shder和material的关系 二、在unity中shader的本质 unity中,shader就…...
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
