Tinylog
Tinylog 是一个专为 Java、Kotlin、Scala 和 Android 设计的轻量级日志记录框架,其核心目标是提供一种高效、简洁且易于集成的日志解决方案。它的设计哲学围绕“轻量”与“高性能”展开,核心库体积极小(仅约 105KB),且不依赖第三方库,仅需 Java 标准库即可运行,显著降低了对应用资源的消耗。
1.在项目中引入 tinylog
<dependency><groupId>org.tinylog</groupId><artifactId>tinylog-api</artifactId><version>2.5.0</version>
</dependency>
<dependency><groupId>org.tinylog</groupId><artifactId>tinylog-impl</artifactId><version>2.5.0</version>
</dependency>
package com.mylog;
import org.tinylog.Logger; // 导入日志工具public class App {public static void main(String[] args) {Logger.info("我的第一条日志!"); // 输出一条信息日志}
}
日志的 5 个级别
学习 5 个级别(从 “不重要” 到 “很重要”):
- TRACE:最详细的记录(比如 “用户点击了按钮”)
- DEBUG:调试时用(比如 “变量 a 的值是 10”)
- INFO:普通消息(比如 “程序启动了”)
- WARN:警告(比如 “内存快满了”)
- ERROR:错误(比如 “文件找不到了”)
Logger.trace("这是TRACE日志");
Logger.debug("这是DEBUG日志");
Logger.info("这是INFO日志");
Logger.warn("这是WARN日志");
Logger.error("这是ERROR日志");
2.配置文件
在src/main/resources
文件夹右键→“New”→“File”,文件名填tinylog.properties
writer = console
writer.format = 【{date:HH:mm:ss}】{level}: {message}
运行App.java
,观察日志格式变成:【15:30:20】INFO: 这是INFO日志
除了 properties,还能用 XML 配置日志(结构更清晰)
<?xml version="1.0" encoding="UTF-8"?>
<configuration><writer name="console"><format>{date} [{level}] {message}</format></writer>
</configuration>
a.同时输出到控制台和文件
修改tinylog.properties
,用writer1
、writer2
配置多个输出目标.
properties
# 第一个输出:控制台
writer1 = console
writer1.format = [{level}] {message}# 第二个输出:文件
writer2 = file
writer2.filename = logs/double.log
writer2.format = {date} {message}
运行代码,验证:控制台有日志,logs/double.log
文件里也有日志
b.设置全局日志级别
writer = console
level = debug # 只显示debug及以上级别(trace不显示)
再把level
改成warn
,运行后发现:只有 WARN 和 ERROR 显示
c.给特定代码包设置不同级别
在src/main/java/com/mylog
下新建一个service
文件夹,里面创建UserService.java
:
package com.mylog.service;
import org.tinylog.Logger;public class UserService {public void login() {Logger.debug("用户登录了(来自UserService)");}
}
在App.java
里调用这个类:
new com.mylog.service.UserService().login();
修改tinylog.properties
,给service
包单独开 DEBUG 级别:
writer = console
level = info # 全局默认info
level.com.mylog.service = debug # service包用debug
运行后观察:UserService
的 DEBUG 日志能显示,App
的 DEBUG 日志不显示
3.滚动日志
“滚动日志” 是解决 “日志文件太大” 的办法.
想象:如果日志一直写在一个文件里,一年后文件会有 1GB,打开很慢. 滚动日志的解决思路:文件满了自动换一个新文件,就像 “作业本写满换一本”.
配置 “文件到 1MB 就自动换新文件”
writer = rolling file
writer.filename = logs/roll.log # 主文件
writer.size = 1MB # 达到1MB就换新文件
writer.format = {message}
写循环代码生成大量日志(让文件超过 1MB)
for (int i = 0; i < 10000; i++) {Logger.info("这是第" + i + "条日志,用来测试滚动");
}
运行后查看logs
文件夹:会生成roll.log
(当前文件)和roll_1.log
(满了的旧文件)
a.限制滚动日志的备份数量
控制 “最多保留多少个旧日志文件”(避免占满硬盘)
修改tinylog.properties
,按日期滚动:
writer = rolling file
writer.filename = logs/day.log
writer.pattern = logs/day_{date:yyyyMMdd}.log # 旧文件名包含日期
writer.rolling = daily # 每天滚动一次
运行代码生成日志,当前文件是day.log
b.按小时自动滚动(每小时一个文件)
writer = rolling file
writer.filename = logs/hour.log
writer.pattern = logs/hour_{date:yyyyMMdd_HH}.log # 包含小时(HH)
writer.rolling = hourly # 每小时滚动
4.用参数化日志避免字符串拼接
更简洁的日志写法,提高性能,把App.java
里的日志都改成参数化写法
Logger.info("用户名为:{},年龄为:{}", name, age); // 简洁
记录异常(错误堆栈信息)
在App.java
里写一段会出错的代码(比如除以 0)
try {int a = 10 / 0; // 这里会报错
} catch (Exception e) {// 记录异常:第一个参数是异常对象,第二个是消息Logger.error(e, "计算时出错了");
}
运行代码,观察日志:会显示错误消息 + 详细的错误位置(哪一行代码出错)
尝试删除e
参数,对比:只显示消息,没有错误位置(不好排查问题)