英文:
How to stop Log4j2 from generating empty log file when the corresponding RollingFileAppender is programitically removed from LoggerConfig?
问题
在我的应用程序中,根据特定条件,我必须保留或移除一个RollingFileAppender。以下是我的log4j2.xml配置:
<Configuration>
<Appenders>
<Console name="LogToConsole">
<PatternLayout pattern="[%t] %5p %-50c{2} - %m%n"/>
</Console>
<RollingFile name="LogToProfileRollingFile" fileName="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:ddd.jvm.startTime}-Profile-log4j.log"
filePattern="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:ddd.jvm.startTime}-Profile-log4j.log.%i">
<PatternLayout>
<Pattern>[%d{yyyy-MMM-dd HH:mm:ss,SSS}] [%t] %-5p %-50c{2}- %m%n</Pattern>
<charset>UTF-8</charset>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="50KB"/>
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
<RollingFile name="LogToRollingFile" fileName="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:DDD.jvm.startTime}-log4j.log"
filePattern="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:ddd.jvm.startTime}-log4j.log.%i">
<PatternLayout>
<Pattern>[%d{yyyy-MMM-dd HH:mm:ss,SSS}] [%t] %-5p %-50c{2}- %m%n</Pattern>
<charset>UTF-8</charset>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="50KB"/>
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.project.log.profile" level="INFO" additivity="false">
<Appender-ref ref="LogToConsole"/>
<Appender-ref ref="LogToProfileRollingFile"/>
<Appender-ref ref="LogToRollingFile"/>
</Logger>
<Root level="info">
<Appender-ref ref="LogToConsole"/>
<Appender-ref ref="LogToRollingFile"/>
</Root>
</Loggers>
</Configuration>
通过以下方式在代码中动态移除了LogToProfileRollingFile appender:
LoggerContext context = LoggerContext.getContext(false);
Configuration configuration = context.getConfiguration();
LoggerConfig loggerConfig = configuration.getLoggerConfig("com.project.log.profile");
if (loggerConfig.getName().equals("com.project.log.profile")) {
loggerConfig.removeAppender("LogToProfileRollingFile");
} else {
throw new RuntimeException("There was no logger " + "loggerName");
}
context.updateLoggers();
现在,在成功移除LogToProfileRollingFile Appender后,日志不再输出到${sys:ddd.jvm.startTime}-Profile-log4j.log
文件中,但是空文件仍然被创建。所以,以下是我的问题:
- 如何阻止创建空的
${sys:ddd.jvm.startTime}-Profile-log4j.log
文件? - 另外,如何在日志文件名中解析和替换环境变量?对于系统属性(就像我在这里设置了
ddd.jvm.startTime
作为系统属性,并用sys:
进行解析一样),这是起作用的。但如果我将它设置为用户或系统环境变量,我无法通过env:
获取它。
英文:
In my application I have to keep or remove an RollingFileAppender based on certain condition. Below is my log4j2.xml
<Configuration><Appenders>
<Console name="LogToConsole">
<PatternLayout pattern="[%t] %5p %-50c{2} - %m%n"/>
</Console>
<RollingFile name="LogToProfileRollingFile" fileName="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:ddd.jvm.startTime}-Profile-log4j.log"
filePattern="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:ddd.jvm.startTime}-Profile-log4j.log.%i">
<PatternLayout>
<Pattern>[%d{yyyy-MMM-dd HH:mm:ss,SSS}{}] [%t] %-5p %-50c{2}- %m%n</Pattern>
<charset>UTF-8</charset>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="50KB"/>
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
<RollingFile name="LogToRollingFile" fileName="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:DDD.jvm.startTime}-log4j.log"
filePattern="${sys:DD_HOME}\logs\DDD\extract\server\Server-${sys:ddd.jvm.startTime}-log4j.log.%i">
<PatternLayout>
<Pattern>[%d{yyyy-MMM-dd HH:mm:ss,SSS}{}] [%t] %-5p %-50c{2}- %m%n</Pattern>
<charset>UTF-8</charset>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="50KB"/>
</Policies>
<DefaultRolloverStrategy max="5"/>
</RollingFile>
</Appenders>
<Loggers>
<Logger name="com.project.log.profile" level="INFO"
additivity="false">
<Appender-ref ref="LogToConsole"/>
<Appender-ref ref="LogToProfileRollingFile"/>
<Appender-ref ref="LogToRollingFile"/>
</Logger>
<Root level="info">
<Appender-ref ref="LogToConsole"/>
<Appender-ref ref="LogToRollingFile"/>
</Root>
</Loggers> </Configuration>
Removed the LogToRollingFile appender programmatically in the following way -
LoggerContext context = LoggerContext.getContext(false);
Configuration configuration = context.getConfiguration();
LoggerConfig loggerConfig = configuration.getLoggerConfig("com.project.log.profile");
if (loggerConfig.getName().equals("com.project.log.profile")) {
loggerConfig.removeAppender("LogToProfileRollingFile");
} else {
throw new RuntimeException("There was no logger " + "loggerName");
}
context.updateLoggers();
Now, after successfully removing the LogToProfileRollingFile Appender, the logs are not getting printed on ${sys:ddd.jvm.startTime}-Profile-log4j.log, but the empty file is getting created. So, below are my questions
- How to stop this empty ${sys:ddd.jvm.startTime}-Profile-log4j.log file from getting created
- Also, how to evaluate and replace environment variables in the log file name. It is working for system propertis(like here I have set ddd.jvm.startTime as system property and evaluating it with sys:). But if I set it as an user or system environment variable, I am not able to get it through env:
专注分享java语言的经验与见解,让所有开发者获益!
评论