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

时间:2017-10-04 12:32:42

标签: java variables log4j2 lookup

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

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

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

所以我希望动态填充logfilename。

使用envrimonment作品进行测试:

<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查找

有哪些区别?

1 个答案:

答案 0 :(得分:1)

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传递给您的程序。

还有其他查找机制,如日期查找地图查找等,这些都是最常用的。可以检查其余详细信息here

由于您想在应用程序中动态设置文件名,并且只想设置一次文件名,我建议您System property。但请确保在初始化System Property

之前设置log4j