我们的团队正试图进入单一构建状态;发送给Test的构建版本与升级到Staging-> etc-> Production的构建相同。现在为不同的环境设置日志记录是一个棘手的问题(目前我们使用Maven配置文件并在构建时过滤记录器配置)。
我们有很多网络应用程序,我希望应用程序可以定义日志记录,并可以根据部署的环境进行配置。
我们使用Log4j,虽然我们对可以使其工作的不同实现持开放态度。我们希望应用程序能够定义记录器,因为某些应用程序可能希望特定日志记录在某些软件包上,但最终,我希望环境能够配置日志记录路径和级别。例如,QA环境通常可以在INFO
包上进行com.foo.bar
级别的日志记录,但是如果它们遇到棘手的问题,他们可能希望将其提升到DEBUG
。我不想重新部署应用程序,因为这在技术上会改变构建。
在最小的情况下,我发现log4j可以直接使用系统属性,所以可以这样设置:
<appender name="someAppender" class="com.whatevs.SomeAppender">
<param name="File" value="${logger.path}/some_app.log"/>
<!-- ... -->
</appender>
<logger name="com.foo.bar">
<level value="${logger.level.com.foo.bar}"></level>
</logger>
<root>
<priority value="${logger.priority}"/>
<appender-ref ref="someAppender"/>
</root>
我担心的是,随着部署的应用数量和定义的记录器数量的增加,维护系统属性的开销可能会变得很麻烦:
-Dlogger.path=/var/log -Dlogger.priority=INFO -Dlogger.level.com.foo.bar=WARN ...
我确信此问题已经解决过了。什么是最好的方法呢?
答案 0 :(得分:2)
使用Log4j api通过代码设置日志级别。因此,根据环境,在应用启动时,您可以设置日志配置。您甚至可以通过提供适当的UI来定义不同包的日志级别,以便在运行时进行配置,当然,如果需要的话。
答案 1 :(得分:2)
有几次尝试使这更好,但到目前为止还没有人提出“标准”解决方案:
您可以使用MBean配置日志记录。
Pro:您可以在运行时远程轻松更改配置 Con:你不能用这种方式保存/收集配置“配置文件”(即一组有用的配置)。
您可以使您的日志记录框架从Web应用程序外部加载配置。
Pro:可以轻松地将文件收集到文件中 您可以使用构建时脚本从模板等生成它们。
Con:您需要将这些文件保存在某处,备份/安装它们等 当找不到任何一个时,你最好找出一种加载默认配置的方法
您可以允许应用程序在运行时切换配置。只需确保初始配置对调试启动问题很有用
某些日志记录框架(如logback)允许包含配置文件。这样可以轻松加载共享配置,然后使用单个系统属性指定要使用覆盖加载哪个包含文件。
目前,我更喜欢最后一种方法,因为它允许任意数量的特殊配置。测试团队可以拥有自己的经理,自己管理,随意更新。
请注意,用slf4j / logback替换log4j意味着只替换几个JAR文件。如果您使用Maven,则需要2分钟(只需添加logback-classic
和log4j-over-slf4j
作为依赖项并删除log4j
)