gpt4 book ai didi

java - 作为文件写入的 Log4j2 系统属性

转载 作者:行者123 更新时间:2023-11-30 08:43:51 24 4
gpt4 key购买 nike

我使用以下 log4j2 配置:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} %-5.5level %-60.60logger - %msg%n" />
<Filters>
<ThresholdFilter level="info" onMatch="ACCEPT"
onMismatch="DENY" />
</Filters>
</Console>
<RollingFile name="RollingFile"
fileName="${sys:log.file}"
filePattern="${sys:log.parent.path}\$${date:yyyy-MM}\${sys:log.file.name}-%d{MM-dd-yyyy}-%i.log.gz">
<PatternLayout>
<Pattern>
%d{yyy-MM-dd HH:mm:ss.SSS} [%30.30t]%-10.10level%-60.60logger - %msg%n
</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="60 MB" />
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<Root level="trace">
<AppenderRef ref="RollingFile" />
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>

当文件位置作为命令行参数传递时设置系统参数,然后函数 reconfigureLog() 设置属性

public static void reconfigureLog(String logPath)
{
File logFile = new File(logPath);
System.setProperty("log.file", logPath);
System.setProperty("log.parent.path", logFile.getParent());
System.setProperty("log.file.name", FilenameUtils.getBaseName(logFile.getName()));

org.apache.logging.log4j.core.Logger rootLogger = (org.apache.logging.log4j.core.Logger) LogManager
.getRootLogger();
LoggerContext context = rootLogger.getContext();
context.reconfigure();
}

这是我从命令行读取参数然后设置的场景的示例用法。

if (cmd.hasOption("logFile"))
{
String logPath = cmd.getOptionValue("logFile");
Utility.reconfigureLog(logPath);
logger = LogManager.getLogger(Test.class);
}

每个类都有一个像这样的静态记录器初始化:

private final static Logger logger = LogManager.getLogger(Connector.class);

问题是当我运行应用程序时,正在创建 ${sys.log.file},然后根据参数创建相应的日志文件。通过参数提示,似乎自动添加了 RolllingFile 下的参数 fileName 。

log4j2 的调试日志是:

2015-12-03 11:07:19,204 main DEBUG Calling createAppender on class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile with params(fileName="${sys:log.file}", filePattern="${sys:log.parent.path}\${date:yyyy-MM}\${sys:log.file.name}-%d{MM-dd-yyyy}-%i.log.gz", append="null", name="RollingFile", bufferedIO="null", bufferSize="null", immediateFlush="null", Policies(CompositeTriggeringPolicy(policies=[TimeBasedTriggeringPolicy(nextRolloverMillis=0, interval=1, modulate=false), SizeBasedTriggeringPolicy(size=62914560)])), null, PatternLayout(%d{yyy-MM-dd HH:mm:ss.SSS} [%30.30t]%-10.10level%-60.60logger - %msg%n), null, ignoreExceptions="null", advertise="null", advertiseURI="null", Configuration(<path>\Connector\target\classes\log4j2.xml))
2015-12-03 11:07:19,207 main DEBUG Starting RollingFileManager ${sys:log.file}

可以看出,系统参数是字面上的picked,而不是substitution。我需要避免提前初始化,仅在调用 reconfigureLog 方法后才开始加载。当我可以将系统参数用作我的应用程序的一部分时,如何避免创建 ${sys.log.file}

最佳答案

长话短说

只需将 ${sys:value} 查找替换为 ${main:--value} 查找。

解释

http://logging.apache.org/log4j/2.x/manual/lookups.html#AppMainArgsLookup

将此功能与配置属性相结合

http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution

而且您可以使用参数进行一些非常强大的配置,而无需接触代码。

请密切注意 PropertySubstitution 文档中的这一点。

If no value is found for the key in the Lookup associated with theprefix then the value associated with the key in the propertiesdeclaration in the configuration file will be used. If no value isfound the variable declaration will be returned as the value. Defaultvalues may be declared in the configuration by doing:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="--file">log_file_path</property>
</Properties>
...
</Configuration>

这意味着像这样的配置查找 ${main:--file} 将返回命令行参数 --file 如果它存在但如果不存在将返回属性中的默认值声明(我不确定属性的名称是否需要是“file”或“--file”才能正确匹配)。如果您的目标是在启动时通过参数简单地设置日志文件,则不需要代码。

关于java - 作为文件写入的 Log4j2 系统属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34070204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com