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"));
那么如何为填充变量
- 上下文映射查找
- Java 查找
有哪些区别?
在log4j2
中有多种查找方式。让我为他们添加一些细节 -
上下文映射查找 - 要使用上下文映射放置值,请使用以下代码 -
org.apache.logging.log4j.ThreadContext.put("logFileName", "app.log");
可以使用 ${ctx:logFileName}
或 %X{logFileName}
在配置文件中访问变量。
上下文映射查找通常用于 Web 应用程序,您希望为每个用户请求提供一些值,即每个 thread
.
环境查找-环境查找用于查找系统环境变量,如USERNAME
、PLATFORM
。您可以使用以下 -
打印 Java 中的所有环境变量
System.out.println(System.getenv());
或任何特定的环境变量 -
System.out.println(System.getenv("NUMBER_OF_PROCESSORS"));
但是,从Java程序中,您不能设置环境变量。
正如您在代码中提到的,可以使用 ${env:NUMBER_OF_PROCESSORS}
语法访问环境变量。
Java 查找 - Java 查找用于 Java 环境信息,如 java version
、hardware
等.变量是固定的,不能在java程序中设置。
可以使用 ${java:vm}
语法访问此类变量,其中 vm
是 java 与环境相关的变量名称。
系统属性查找 - 使用下面的代码很容易获取和设置这些属性 -
System.setProperty("logFileName", "app.log");
System.getProperty("logFileName");
可以使用 ${sys:logFileName}
语法在 log4j2 配置文件中访问变量。
这些系统属性的好处是您可以将这些属性作为 VM Arguments
传递给您的程序,例如 -DlogFileName=app3.log
。
还有其他查找机制,如Date Lookup、Map Lookup等,这些机制用得最多。休息详情可查看here
既然你想在你的应用程序中动态设置文件名,如果你只想设置一次文件名,我建议你System property
。但请确保在初始化 log4j
之前设置 System Property
在我的 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"));
那么如何为填充变量
- 上下文映射查找
- Java 查找
有哪些区别?
在log4j2
中有多种查找方式。让我为他们添加一些细节 -
上下文映射查找 - 要使用上下文映射放置值,请使用以下代码 -
org.apache.logging.log4j.ThreadContext.put("logFileName", "app.log");
可以使用 ${ctx:logFileName}
或 %X{logFileName}
在配置文件中访问变量。
上下文映射查找通常用于 Web 应用程序,您希望为每个用户请求提供一些值,即每个 thread
.
环境查找-环境查找用于查找系统环境变量,如USERNAME
、PLATFORM
。您可以使用以下 -
System.out.println(System.getenv());
或任何特定的环境变量 -
System.out.println(System.getenv("NUMBER_OF_PROCESSORS"));
但是,从Java程序中,您不能设置环境变量。
正如您在代码中提到的,可以使用 ${env:NUMBER_OF_PROCESSORS}
语法访问环境变量。
Java 查找 - Java 查找用于 Java 环境信息,如 java version
、hardware
等.变量是固定的,不能在java程序中设置。
可以使用 ${java:vm}
语法访问此类变量,其中 vm
是 java 与环境相关的变量名称。
系统属性查找 - 使用下面的代码很容易获取和设置这些属性 -
System.setProperty("logFileName", "app.log");
System.getProperty("logFileName");
可以使用 ${sys:logFileName}
语法在 log4j2 配置文件中访问变量。
这些系统属性的好处是您可以将这些属性作为 VM Arguments
传递给您的程序,例如 -DlogFileName=app3.log
。
还有其他查找机制,如Date Lookup、Map Lookup等,这些机制用得最多。休息详情可查看here
既然你想在你的应用程序中动态设置文件名,如果你只想设置一次文件名,我建议你System property
。但请确保在初始化 log4j
System Property