我使用log4j记录信息。我使用log4j.xml
文件创建日志文件。我将每个日志文件的绝对路径作为param
标记值。
例如:
<appender name="FA" class="org.apache.log4j.DailyRollingFileAppender">
<param name="DatePattern" value="'_'yyyyMMdd"/>
<param name="File" value="D:/logFiles/GPreprocessor.log"/>
<layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>
I do not want to write "GPreprocessor.log" directly. Actually, that file name is dynamic, based on my project's name. For example, if I run the program ABC.java, logging should go to D:/logFiles/ABC.log
, but if I run XYZ.java, logging should go to D:/logFiles/XYZ.log
. The file's location will always remain the same: D:/logFiles/
. How can I change the log file's name dynamically?
6条答案
按热度按时间o2g1uqev1#
执行以下操作要容易得多:
在log4j.xml中,将变量定义为${variable}:
然后确保在启动JVM时设置了system属性,例如:
这将创建一个动态日志文件名:
my_fancy_filename.log
或者,您可以在代码中设置system属性,只要您在创建日志记录器之前设置即可(例如,如果您希望在日志中包含PID,这将非常有用)。
一旦设置好,您就可以继续正常地获取日志记录器,它们将记录到动态文件(要注意那些在主方法执行之前创建日志记录器的静态日志记录器)。
jhkqcmku2#
下面是我使用Log4J动态生成文件名的代码。它根据输入文件名和当前日期时间更改文件名。(如果你多次运行同一个文件,这很有帮助。)
现在每当你想在你的程序中使用logger,只要写这两行:
快乐编码。
wkyowqbh3#
用你自己的类扩展
FileAppender
会更有意义,你可以在类中重写setOptions()
方法,然后在log4j.properties
中配置root用户登录到yourpackage.yourFileAppender
,这样更简洁。q0qdq0h24#
在包含main方法的类中,将类名设置为某个系统属性。在下面的示例中,我使用
log_dir
作为属性名。在log4j.xml文件中,使用文件参数value属性中的
log_dir
属性工作起来像一个魅力
qmb5sa225#
在执行任何操作之前,log4j都会彻底检查log4j.xml配置文件的类路径,假设您在项目中引用的库jar中有任何log4j.xml配置文件,log4j会将该文件作为配置文件加载并开始日志记录。当您通过从@Big B建议的系统属性中获取值来动态设置FileAppender中的日志文件位置时,因为log4j已经加载了它首先发现的配置文件,所以它将不工作。
为了防止这种情况发生,你可以使用
DOMConfigurator
来通知log4j它应该加载什么配置文件以及什么时候加载。因此,一旦你在你的程序中设置了LogFileLocation的系统属性,就可以使用DOMConfigurator来加载想要的属性文件,方法如下:通过这种方式,您将在程序中设置系统属性LogFileLocation之后加载log4j.xml(它还将覆盖已经加载的配置)。
在log4j.xml配置中,您可以在参数标记“File”中设置文件位置:
为了更好地理解我所说的内容,请在VM参数中提供
-Dlog4j.debug=true
,并查看控制台中的log4j执行日志。olhwl3o26#
对我来说,只有在使用${sys:...如下所示。如果没有这个,它就不会在java命令中拾取变量集。