【问题标题】:How to change log4j2 logging path on tomcat?如何更改tomcat上的log4j2日志路径?
【发布时间】:2015-02-28 09:28:05
【问题描述】:

我正在使用spring-boottomcat 上运行一个网络应用程序。

如何动态更改log4j2.xml 日志记录路径? (例如通过 jvm args、属性文件或其他)?

到目前为止,我将日志xml配置如下:

<Configuration>
    <Properties>
        <property name="path">${bundle:application:log.path}</property>
    </Properties>
</Configuration>

带配置文件:

#application.properties:
log.path=d:/

现在我想动态地将日志路径强制为例如d:/log-test,但不必修改我的war 文件。因为在重新部署时我会丢失任何手动配置。

那么我怎样才能提供不同的日志记录路径呢?

我想在同一台机器上运行多个配置文件,所以这里的环境或系统属性对我没有用处。

【问题讨论】:

  • 部署中的war文件应该被取消jar,然后你应该能够直接修改你的属性文件。您只需要重新启动应用程序,以便 log4j 再次读取属性文件。
  • @RaviThapliyal 这正是我想要阻止的,因为在部署新版本时,我每次都必须明确修改war文件。不是说同事可能会错过重要的一步......
  • 日志路径很少是绝对的,也不是每次部署都会改变它。最终路径显然会提交到您的存储库并反映在最终构建中。如果您仍然觉得需要覆盖它,那么将值外部化到属性文件有什么用?在构建后进行,我认为有点违背了它的目的。

标签: java spring log4j spring-boot log4j2


【解决方案1】:

你可以通过here提到的多种方式做到这一点

如果你想通过环境变量,那么你可以这样做:

${env:MY_LOG_PATH}

如果系统属性则:

${sys:MY_LOG_PATH}

【讨论】:

  • 这些对我来说都不是有用的属性,因为我想在同一台机器上运行测试 + 开发配置文件。
  • 所以你应该清楚地提到这一点。您刚才说“现在我想动态地将日志路径强制为例如 d:/log-test,但不必修改我的 war 文件。”为什么它对你不起作用?你不能在同一台机器上定义两个不同的系统属性吗?
  • 如果我定义了 2 个不同的系统道具,那么我必须明确编辑我的战争的日志文件内容。这也是我想要阻止的。
  • 不是系统属性属性驱动的吗? dev 你有一个,UAT 你有一个,prod 你有一个?如果不是这样,那么恐怕任何事情都会有所帮助。
  • 可能你是对的,在不同的 tomcat 中运行 webapp,每个 tomcat 都设置了一个 env 变量可能是正确的解决方案。
【解决方案2】:

正如已经建议的那样,使用 ${sys:LOG_PATH} 可能是最好的解决方案。您不必修改战争,但您必须为开发运行一个 tomcat,并为测试运行一个单独的 tomcat。然后只需在 setenv.sh 或 setenv.bat 中放置 set CATALINA_OPTS 以包含 -DLOG_PATH=/my/log/path 无论如何让一个 tomcat 运行这两者确实没有多大意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2017-07-30
    • 2011-11-26
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多