在 log4j2 中启用 LZMA(2)(即 .xz)压缩

Enabling LZMA(2) (i.e. `.xz`) compression in log4j2

世界现状

目前 log4j2.xml 中的 RollingFileAppender 使用 Gzip 压缩:

<RollingFile name="RollingFile"
             fileName="logs/engine.log"
             filePattern="logs/engine.log.%i.gz">

目标

我想切换到 LZMA(2)(即 .xz)压缩,以享受更高的压缩率。

尝试

我尝试将 engine.log.%i.gz 更改为 engine.log.%i.xz — 根据 the documentation:

If the file pattern ends with .gz, .zip, .bz2, .deflate, .pack200, or .xz the resulting archive will be compressed using the compression scheme that matches the suffix. The formats bzip2, Deflate, Pack200 and XZ require Apache Commons Compress. In addition, XZ requires XZ for Java.

此外,我已确保我对 XZ for Java 具有运行时依赖性 — 通过 pom.xml:

<dependency>
    <!-- Support Log4j2 Log compression schemes: ".gz", ".zip", ".bz2", ".deflate", ".pack200", [".xz" (part 1 of 2)] -->
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-compress</artifactId>
    <version>1.11</version>
</dependency>
<dependency>
    <!-- Support Log4j2 Log compression scheme [".xz" (part 2 of 2)] -->
    <groupId>org.tukaani</groupId>
    <artifactId>xz</artifactId>
    <version>1.5</version>
</dependency>

结果

当触发 RollingFileAppender 时:创建的存档确实 named engines.log.1.xz — 根据需要。

但是,其内容不正确:

预期

engines.log.1.xz 应包含 LZMA(2) 压缩文本

实际

engines.log.1.xz 而是包含未压缩的纯文本。

完整性检查

我确认 org.tukaani:xzorg.apache.commons:commons-compress 成功进入了我的 jar 的 class 路径:

 jar tf mycooljar.jar | grep tukaani
org/tukaani/
org/tukaani/xz/
…

 jar tf mycooljar.jar | grep org/apache/commons/compress
org/apache/commons/compress/
org/apache/commons/compress/changes/
…

此 Java 程序未部署到 J2EE 网络服务器。我相信它的 class 加载很简单。

总结

我已正确遵循创建 .gz 档案所需的说明。

我认为创建 .xz 档案所需的唯一额外步骤是:我必须在运行时提供 XZ for Java 工件。我已经做到了。

我是不是漏掉了什么?我很想相信以下之一:

Remko Popma confirmed that this is a bug:

  • log4j-core 只接受 *.xy 作为匹配模式——而文档建议 *.xz 是必需的输入。
  • "xy" 被传递到 new CommonsCompressAction(…) 而不是所需的 "xz".

这些都被认为是拼写错误:提议的解决方案是将两者都更改为 xz

Gary Gregory wrote a fix。该修复程序目前在 org.apache.logging.log4j:log4j-core:2.6-SNAPSHOTmaster 中,因此应该与 2.6.

一起发布