在我的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"));
那么如何填充变量
有哪些区别?
在中有多种查找方法log4j2
。让我为他们添加一些细节-
上下文映射查找- 要使用上下文映射放置值,请使用以下代码-
org.apache.logging.log4j.ThreadContext.put("logFileName", "app.log");
可以使用${ctx:logFileName}
或在配置文件中访问变量%X{logFileName}
。
上下文映射查找通常在Web应用程序中使用,在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等。休息详情可以在这里查看
由于您想在应用程序中动态设置文件名,并且如果只想设置一次文件名,建议您使用System property
。但是请确保System Property
在初始化之前进行设置log4j
很好的简单甚至详尽的解释-gracias