如何设置log4j输出文件相对于我的jar?

时间:2016-05-24 11:26:40

标签: java logging intellij-idea log4j

我有一个intellij java项目。

我已添加此log4j.properties

# Root logger option
log4j.rootLogger=INFO, file, stdout

# Direct log messages to a log file
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=C:\\logging.log

如何将log4j.appender.file.File设置为相对于我的项目位置?

如何将输出文件设置为:

src/main/resources/logs/log.txt

3 个答案:

答案 0 :(得分:4)

您可以使用.\your file name

.\用于指代您的项目位置。

e.g。 .\abc.log,在eclipse的情况下,此文件存在于工作区的项目文件夹中。

对于jar,此文件将写入存在.jar文件的文件夹中。

答案 1 :(得分:0)

我无法通过在log4j.properties中设置正确的属性找到直接的解决方案。但是我可以提出两种解决方案。 首先,在属性中设置相对路径,使该路径不是相对于项目(或jar),而是从中运行应用程序的目录。因此,如果您正在创建一个调用jar的服务,它将从/etc/init.d目录中调用它,并且您的日志(很可能)将无处可用。

其中一个选项是设置一个环境变量,您希望获得日志。 Log4j处理环境变量。只需设置log4j.appender.file.File=${varname}

即可

另一种选择,如果您使用shell脚本启动服务/ app / jar,请在运行之前cd到其目录(假设您的路径设置为log4j.appender.file.File=./logs/myOutput.log)。像这样:

process="/path/to/your/jar/test.jar"
processName=`basename $process`
processDir=`dirname $process`

cd $processDir
java -jar "./$processName"

在这种情况下,您的日志将位于/path/to/your/jar/logs/myOutput.log

答案 2 :(得分:0)

将日志文件输出到jar相对目录的方式。

在java文件中设置一个jar目录到ThreadContext,

    Path jarDir = new File(MyClass.class.getProtectionDomain().getCodeSource().getLocation()
    .toURI()).getPath().getParent(); // get a jar directory
    ThreadContext.put("jarDir", jarDir.toString()); // This needs to be done before `LogManager.getLogger()`
    Logger logger = LogManager.getLogger();

并在配置文件中使用它。

    <File name="File" fileName="${ctx:jarDir}/logfile.log">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %msg" charset="UTF-8" />
    </File>

参考文献:
How to get the path of a running JAR file?
http://logging.apache.org/log4j/2.x/manual/thread-context.html
http://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution