3

世界现状

目前我们的RollingFileAppenderinlog4j2.xml使用 Gzip 压缩:

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

目标

我想切换到 LZMA(2)(即.xz)压缩,以享受改进的压缩比。

试图

我已尝试更改engine.log.%i.gzengine.log.%i.xz- 根据文档

如果文件模式以.gz, .zip, .bz2, .deflate,结尾.pack200,或者.xz生成的存档将使用与后缀匹配的压缩方案进行压缩。bzip2、Deflate、Pack200 和 XZ 格式需要 Apache Commons Compress。此外,XZ 需要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 被触发时:创建的档案确实是根据需要命名 engines.log.1.xz的。

但是,其内容不正确:

期待

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

实际的

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

健全性检查

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

 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 网络服务器。我相信它的类加载很简单。

概括

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

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

我在这里错过了什么吗?我很想相信以下其中一项:

  • 功能坏了
  • 文档不完整/不正确
  • log4j2 无法在运行时发现类
4

1 回答 1

2

Remko Popma 确认这是一个错误

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

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

Gary Gregory 写了一个修复程序。该修复程序目前在masterof 中org.apache.logging.log4j:log4j-core:2.6-SNAPSHOT,因此应该与2.6.

于 2016-04-24T12:05:49.787 回答