温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - log4J2 Store and use variables / lookup-values
java lookup variables log4j2

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

发布于 2020-03-27 16:03:44

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

因此,根据log4j文档,我将假定使用查找值来执行此操作。

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

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

测试环境工程:

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

有哪些区别?

查看更多

查看更多

提问者
Thorsten Niehues
被浏览
102
Vikas Sachdeva 2017-10-05 09:24

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

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

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

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

上下文映射查找通常在Web应用程序中使用,在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等。休息详情可以在这里查看


由于您想在应用程序中动态设置文件名,并且如果只想设置一次文件名,建议您使用System property但是请确保System Property在初始化之前进行设置log4j