在我的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"));
所以如何填写
的变量有哪些区别?
答案 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环境信息,如java version
,hardware
等。变量是固定的,无法在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