在log4j包级属性中使用环境变量?

时间:2019-05-21 15:28:21

标签: logging clojure log4j log4j2

我正在使用log4j来管理Clojure应用程序中的日志记录。我希望能够使用系统变量为log4j.properties文件中的单个程序包设置日志级别。因此,例如,这是我的基本属性文件:

log4j.rootLogger=INFO,console,sentry
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss,SSSZ} %-5p [%t] %-4r %c %x - %m%n

log4j.logger.company.logging.logger=DEBUG

这会将日志记录级别设置为company.logging.logger中的DEBUG(位于特定的日志记录代码。但是,我不希望这样-我希望它在本地是DEBUG,而在生产(AWS)上是INFO。因此,我使用一个环境变量:

log4j.rootLogger=INFO,console,sentry
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss,SSSZ} %-5p [%t] %-4r %c %x - %m%n

log4j.logger.company.logging.logger=${env:LOG_LEVEL}

无效。在这种情况下,LOG_LEVEL设置为DEBUG,我可以通过使用环境变量将root日志记录级别设置为DEBUG来确认它是否可以工作。

例如,

log4j.rootLogger=${env:LOG_LEVEL},console,sentry
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd'T'HH:mm:ss,SSSZ} %-5p [%t] %-4r %c %x - %m%n

log4j.logger.company.logging.logger=${env:LOG_LEVEL}

这会将整个应用程序的日志记录级别设置为DEBUG。这是不希望的:它使应用程序日志变得冗长而无法使用。

问题是这样的:

是否可以使用环境变量在log4j中设置单个程序包的日志级别?这是L4J生态系统中的错误吗?还是这种预期的行为,而我们应该以另一种方式解决此问题?

1 个答案:

答案 0 :(得分:0)

由于您使用的是Lo4j 1.x API,因此可以通过编程方式将一个或多个Java包的日志级别设置为从环境变量中获取的值,该值将在开发过程中设置为默认值,并设置为其他值生产中

有关如何实现此操作的示例,请参见https://stackoverflow.com/a/4598829/483566。此链接中的评论之一建议如下:

LogManager.getLogger(Class.forName("org.hibernate.util.JDBCExceptionReporter")).setLevel(Level.FATAL);

...应该很容易翻译成Clojure。

注意:您似乎正在使用停产的Logj1.x。您应该使用Log4j2或类似tools.logging之类的东西。