1. 概述

tinylog 是一个专为 Java 应用和安卓应用设计的轻量级日志框架。本教程将介绍如何通过 tinylog 输出日志记录,以及如何配置该框架。tinylog 的某些设计理念与 Log4jLogback 差异显著,我们将在后续内容中展开说明。

2. 快速入门

首先,在 pom.xml 文件中添加 tinylog APItinylog 实现 的依赖:

<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 获取。


原始标题:Lightweight Logging With tinylog 2