1. 概述
tinylog 是一个专为 Java 应用和安卓应用设计的轻量级日志框架。本教程将介绍如何通过 tinylog 输出日志记录,以及如何配置该框架。tinylog 的某些设计理念与 Log4j 和 Logback 差异显著,我们将在后续内容中展开说明。
2. 快速入门
首先,在 pom.xml 文件中添加 tinylog API 和 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>
接下来创建一个 Java 应用并添加日志语句:
package com.baeldung.tinylog;
import org.tinylog.Logger;
public class Application {
public static void main(String[] args) {
Logger.info("Hello World!");
}
}
与其他日志框架不同,tinylog 提供静态日志类。因此无需为每个使用日志的类创建日志实例,这减少了样板代码。尽管如此,tinylog 仍能输出包含源码位置信息的日志。
例如,无配置运行应用时,日志默认输出到控制台:
2023-01-01 14:17:42 [main] com.baeldung.tinylog.Application.main()
INFO: Hello World!
3. 日志记录
通常我们需要记录动态内容而非静态文本。tinylog 提供多种日志方法适应不同场景。*每个日志方法均支持五种严重级别:trace()*, debug(), info(), warn(), *error()***。为简化示例,后续代码仅展示其中一种级别。
3.1. 占位符
可通过带占位符的文本在运行时组装日志消息:
Logger.info("Hello {}!", "Alice"); // 输出: Hello Alice!
记录数字时可自定义格式,例如输出 π 并保留两位小数:
Logger.info("π = {0.00}", Math.PI); // 输出: π = 3.14
tinylog 支持通过 Lambda 实现延迟日志。当日志级别未启用时,Lambda 表达式不会执行。若生产环境明确禁用某些日志级别,Lambda 延迟日志可显著提升性能:
Logger.debug("Expensive computation: {}", () -> compute());
3.2. 异常处理
在 tinylog 中,异常必须作为日志记录的第一个参数,避免与占位符参数混淆:
try {
int i = a / b;
} catch (Exception ex) {
Logger.error(ex, "Cannot divide {} by {}", a, b);
}
当然,也可以单独记录异常而不附加消息,此时 tinylog 自动使用异常消息:
try {
int i = a / b;
} catch (Exception ex) {
Logger.error(ex);
}
4. 配置
推荐使用 properties 文件配置 tinylog。启动时框架会自动加载默认包下的 tinylog.properties,该文件通常位于 src/main/resources 目录(具体位置取决于构建工具)。
4.1. 控制台输出
Java 应用中 tinylog 默认输出日志到控制台。但也可显式配置控制台写入器并自定义输出格式。
配置控制台写入器仅记录 info 及以上级别的日志(忽略 trace 和 debug):
writer = console
writer.level = info
默认日志输出为双行格式,改为单行输出:
writer = console
writer.format = {date: HH:mm:ss.SSS} [{level}] {class}: {message}
占位符说明:
{class}
:完整类名{level}
:日志级别{date}
:日期/时间{message}
:日志消息(含异常信息)
**日期时间格式依赖 Java 版本使用 SimpleDateFormat 或 *DateTimeFormatter***,支持所有标准日期模式。
运行应用后控制台输出:
14:17:42.452 [INFO] com.baeldung.tinylog.Application: Hello World!
4.2. 日志文件
tinylog 提供四种文件写入器。实际应用中滚动文件写入器最常用,本节重点介绍该类型。
滚动文件写入器可在特定事件触发时创建新文件。例如配置启动时和每日 6 点创建新文件:
writer = rolling file
writer.file = logs/myapp_{date: yyyy-MM-dd}_{count}.log
writer.policies = startup, daily: 06:00
writer.format = {class} [{thread}] {level}: {message}
文件路径需使用占位符避免覆盖旧文件。上述配置使用日期和计数器占位符,例如 2023 年 1 月 1 日多次启动应用将生成:
- logs/myapp_2023-01-01_0.log
- logs/myapp_2023-01-01_1.log
policies 定义触发新文件的事件,格式模式与控制台写入器相同。
为节省存储空间,可压缩日志文件并限制备份数量:
writer = rolling file
writer.file = logs/myapp_{date: yyyy-MM-dd}_{count}.log
writer.convert = gzip
writer.backups = 100
启用 gzip 压缩后,当前日志文件保持未压缩状态,新文件创建时自动压缩旧文件并添加 .gz 后缀。当压缩文件超过 100 个时,tinylog 会删除最旧的文件。
4.3. Logcat 输出
安卓应用中 tinylog 默认通过 Logcat 输出日志。也可显式配置 Logcat 写入器并自定义输出。
创建主活动类作为配置基础:
package com.baeldung.tinylog;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import org.tinylog.Logger;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
Logger.info("Hello World!");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
配置 Logcat 写入器记录 debug 及以上级别日志(忽略 trace):
writer = logcat
writer.level = debug
tinylog 可自动计算标签(tag),无需像安卓原生 Log 类手动传递。默认使用不含包名的简单类名作为标签,例如 com.baeldung.tinylog.MainActivity 类的日志标签为 MainActivity。
标签计算可自定义。若使用带标签的日志器,可将 tinylog 标签同步到 Logcat:
public class MainActivity extends AppCompatActivity {
private final TaggedLogger logger = Logger.tag("UI");
@Override
protected void onCreate(Bundle savedInstanceState) {
logger.info("Hello World!");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
重新配置 Logcat 写入器使用标签:
writer = logcat
writer.tagname = {tag}
4.4. 多写入器
tinylog 支持同时使用多个写入器。可通过数字编号配置:
writer1 = console
writer1.level = debug
writer2 = rolling file
writer2.file = myapp_{count}.log
或使用语义化命名:
writerConsole = console
writerConsole.level = debug
writerFile = rolling file
writerFile.file = myapp_{count}.log
tinylog 识别所有以 writer 开头的属性,但每个写入器需唯一命名以符合 Java properties 规范。
4.5. 异步输出
为避免日志输出阻塞应用线程,tinylog 支持异步日志记录。使用文件写入器时强烈推荐此模式。
启用写入线程即可实现异步输出:
writingthread = true
此配置下 tinylog 使用独立线程处理日志输出。
滚动文件写入器可通过缓冲输出进一步提升性能。默认每次日志写入单独执行 IO 操作,启用缓冲后可批量写入:
writer = rolling file
writer.file = myapp_{count}.log
writer.buffered = true
5. 总结
本文介绍了 tinylog 2 的核心日志方法和配置参数,重点展示了实际应用中最常用的功能。更多高级特性可参考官方文档。
本文示例代码可在 GitHub 获取。