【问题标题】:slf4j over log4j configuration after deploymentslf4j 部署后的 log4j 配置
【发布时间】:2015-12-14 08:50:58
【问题描述】:

我已经构建了一个 java 应用程序,并且一直在使用 slf4j/log4j 进行日志记录。我现在想为用户提供更改日志级别的可能性,而无需重新构建 .jar 文件。

我已经阅读过,要做到这一点,您的属性文件需要位于应用程序的类路径中。我尝试使用 MANIFEST.MF 文件中的 Class-Path 标头来实现这一点,但是它不起作用。

这是我试过的两个例子。

Class-Path:./config/
Class-Path:C:/users/user/directory/tools/config/

但是,当应用程序开始运行时,我尝试打印其内容,因此这些似乎都没有添加到类路径中。

【问题讨论】:

    标签: java log4j slf4j


    【解决方案1】:

    正如this question 所建议的,我最终在java 执行命令中添加了一个参数。请记住,如果您像我一样通过 bash 命令执行,则需要将完整路径添加到目录。

    java -Dlog4j.configuration=file:/path/to/log4j.properties -jar myApp.jar
    

    我不喜欢这个,因为它非常依赖路径配置,但它就足够了。

    【讨论】:

    • 看看我更新的答案。这可能是防止硬编码绝对路径的解决方案。
    【解决方案2】:

    请在下面找到可能的解决方案列表。

    1) java -jar myApp.jar 将按以下顺序搜索log4j.properties

    • myApp.jar 的根
    • myApp.jar 的标头Class-Path: 中指定的目录

    2) java -Dlog4j.configuration=file://path/to/file//log4j.properties -jar myApp.jar 将使用-Dlog4j.configuration=... 指定的属性文件

    3) java -Xbootclasspath/a:../config -jar myApp.jar 将按以下顺序搜索log4j.properties

    • 目录../config/
    • myApp.jar 的根
    • myApp.jar 的清单头 ​​Class-Path: 中指定的目录

    我相信解决方案 1) 应该可以解决您的问题,如下所示

    • 确保myApp.jar 的根目录中没有log4j.configuration
    • 清单头连续,例如Class-Path: config/
    • 你的安装目录结构是
      ./myApp.jar
      ./config/

    编辑 避免硬编码路径但使用log4j.properties 文件的定义位置的可能解决方案如下。

    假设您的应用程序具有以下结构

    c:\somewhere\myApp.jar
    c:\somewhere\config\log4j.properties
    c:\somewhere\run_myapp.cmd
    

    run_myapp.cmd

    @echo off
    ... do your necessary preparation here
    java -Dlog4j.configuration=file:%~dp0log4j_2.properties -jar myApp.jar
    

    这将始终使用相对于您的myApp.jarconfig\log4j.properties

    %~pd - 扩展为run_myapp.cmd 的驱动器号和路径

    使用此解决方案,您的用户需要将属性文件存储在给定位置,但不需要更改 run_myapp.cmd 脚本。

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 1970-01-01
      • 2015-09-06
      • 2013-09-29
      • 1970-01-01
      • 2020-07-13
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      相关资源
      最近更新 更多