log4J2 存储和使用变量/查找值

log4J2 Store and use variables / lookup-values

在我的 java 程序中,我想使用多个日志文件。

所以根据 log4j 文档,我假设查找值用于执行此操作。

Lookups 页面描述了如何构建配置文件。但是关于如何存储值以便配置文件检索值的信息很少。

所以我想动态填充日志文件名。

测试环境工作:

<File name="MyFile" fileName="${env:USERERNAME}" immediateFlush="false" append="false">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
</File>

我假设 System.getProperty("USER") 会匹配 java 查找 ${java:USER} 但它不起作用。

我使用以下方法测试了两个变量:

System.out.println("USER: " + System.getProperty("USER"));
System.out.println("USERNAME: " + System.getenv("USERNAME"));

那么如何为填充变量

有哪些区别?

log4j2中有多种查找方式。让我为他们添加一些细节 -

上下文映射查找 - 要使用上下文映射放置值,请使用以下代码 -

org.apache.logging.log4j.ThreadContext.put("logFileName", "app.log");

可以使用 ${ctx:logFileName}%X{logFileName} 在配置文件中访问变量。

上下文映射查找通常用于 Web 应用程序,您希望为每个用户请求提供一些值,即每个 thread.

环境查找-环境查找用于查找系统环境变量,如USERNAMEPLATFORM。您可以使用以下 -

打印 Java 中的所有环境变量
System.out.println(System.getenv());

或任何特定的环境变量 -

System.out.println(System.getenv("NUMBER_OF_PROCESSORS"));

但是,从Java程序中,您不能设置环境变量。

正如您在代码中提到的,可以使用 ${env:NUMBER_OF_PROCESSORS} 语法访问环境变量。

Java 查找 - Java 查找用于 Java 环境信息,如 java versionhardware 等.变量是固定的,不能在java程序中设置。

可以使用 ${java:vm} 语法访问此类变量,其中 vm 是 java 与环境相关的变量名称。

系统属性查找 - 使用下面的代码很容易获取和设置这些属性 -

System.setProperty("logFileName", "app.log");
System.getProperty("logFileName");

可以使用 ${sys:logFileName} 语法在 log4j2 配置文件中访问变量。

这些系统属性的好处是您可以将这些属性作为 VM Arguments 传递给您的程序,例如 -DlogFileName=app3.log

还有其他查找机制,如Date LookupMap Lookup等,这些机制用得最多。休息详情可查看here


既然你想在你的应用程序中动态设置文件名,如果你只想设置一次文件名,我建议你System property。但请确保在初始化 log4j

之前设置 System Property