如何将 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
我有一个 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