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

how to set log4j output file to be relative to my jar?

我有一个 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 ?

您可以使用 .\your file name.

.\ 用于引用您的项目位置。

例如.\abc.log,如果是 eclipse,则此文件存在于工作区的项目文件夹中。

如果是 jar,此文件将写入您的 .jar 文件所在的文件夹中。

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

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

另一种选择,如果您使用 shell 脚本来启动您的 service/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

日志文件输出到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