部署后{4}的s44j over log4j配置

时间:2015-12-14 08:50:59

标签: java log4j slf4j

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

我已经读过这样做,你的属性文件需要在应用程序的类路径中。我已尝试在MANIFEST.MF文件中使用Class-Path标头来实现此目的,但它无效。

这是我尝试的两个例子。

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

然而,这些似乎都没有添加到类路径中,因为我已经尝试在应用程序开始运行后打印其内容。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

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

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

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
  • 的根
  • Class-Path:
  • 的清单标题myApp.jar中指定的目录

我认为解决方案 1)应解决您的问题,如下面的

  • 确保log4j.configuration
  • 的根目录中没有myApp.jar
  • 例如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

这将始终使用相对于config\log4j.properties的{​​{1}}。

myApp.jar - 扩展为驱动%~pd

的字母和路径

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