2017-10-04 376 views
1

在我的java程序中我想使用几个日志文件。log4J2存储和使用变量/查找值

所以根据log4j文档,我会假设查找值是用来做到这一点。

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

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

测试与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查找

是哪些区别:

我测试使用两个变量?

+0

是不是只是一个错字? (你写了'$ {env:USERERNAME}') –

+0

no - 我编辑了这个问题来澄清 –

+0

我的意思是在你的配置中:'

回答

1

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 versionhardware等变量是固定的,也不会在Java程序中设置的Java环境的信息。

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

系统属性查询 -这是很容易获取和设置使用下面的代码这样的性质 -

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

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

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

还有其他的查询机制也喜欢日期查找地图查找等基本都是使用。其余的细节可以检查here


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

+0

非常好的简单甚至详细的解释 - muchas gracias –