Play Framework - 更改日志文件位置
Play Framework - Change the log file location
我使用 "Dlogger.file" 的外部 logback 文件如下,
..... -Dconfig.file="C:\temp\application.conf" **-Dlogger.file="c:\temp\logback.xml"** -Dpidfile.path=NULL -Dhttps.port=443 -Dhttp.por ..............
我的 logback.xml
文件看起来像这样,
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${application.home}/application.log</file>
<encoder>enter code here
<pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
</encoder>
</appender>
而不是 ${application.home}
(在 logback.xml
文件中)我想用 application.conf 中定义的键替换它,例如
application.logpath="c:/temp"
或者换句话说,我想在 application.conf 中定义日志文件位置(路径)。
在下面添加 <configuration>
:
<property resource="application.conf" />
然后使用 ${application.logpath}
:
<file>${application.logpath}/application.log</file>
实现此目的的最简单方法是:
... -Dapplication.home="C:/temp/somedir"
但不幸的是,它向您的启动命令附加了一个参数。
您当前的解决方案不起作用的原因仅仅是因为 Logback 在 class 加载期间自行配置,但这是您的 config.file 尚未加载的时刻。
因此,要使其正常工作,您可以使用一个小技巧:启动后重新初始化 logback:
import play.*;
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
reloadLoggerContext();
Logger.info("Application has started");
}
@Override
public void onStop(Application app) {
// ...
}
private void reloadLoggerContext() throws JoranException {
// Hack to use system properties inside logback.xml
LoggerContext ctx = new LoggerContext();
ctx.reset();
new ContextInitializer(ctx).autoConfig();
}
}
玩就可以了!框架会将 application.home
导出为系统 属性 或环境变量。如果它不会发生(我不知道 Play! 好),那么你可以自己用这样的东西来做:
System.setProperty("application.home", app.configuration().getString("application.home"));
我使用 "Dlogger.file" 的外部 logback 文件如下,
..... -Dconfig.file="C:\temp\application.conf" **-Dlogger.file="c:\temp\logback.xml"** -Dpidfile.path=NULL -Dhttps.port=443 -Dhttp.por ..............
我的 logback.xml
文件看起来像这样,
<configuration>
<conversionRule conversionWord="coloredLevel" converterClass="play.api.Logger$ColoredLevel" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${application.home}/application.log</file>
<encoder>enter code here
<pattern>%date - [%level] - from %logger in %thread %n%message%n%xException%n</pattern>
</encoder>
</appender>
而不是 ${application.home}
(在 logback.xml
文件中)我想用 application.conf 中定义的键替换它,例如
application.logpath="c:/temp"
或者换句话说,我想在 application.conf 中定义日志文件位置(路径)。
在下面添加 <configuration>
:
<property resource="application.conf" />
然后使用 ${application.logpath}
:
<file>${application.logpath}/application.log</file>
实现此目的的最简单方法是:
... -Dapplication.home="C:/temp/somedir"
但不幸的是,它向您的启动命令附加了一个参数。
您当前的解决方案不起作用的原因仅仅是因为 Logback 在 class 加载期间自行配置,但这是您的 config.file 尚未加载的时刻。
因此,要使其正常工作,您可以使用一个小技巧:启动后重新初始化 logback:
import play.*;
public class Global extends GlobalSettings {
@Override
public void onStart(Application app) {
reloadLoggerContext();
Logger.info("Application has started");
}
@Override
public void onStop(Application app) {
// ...
}
private void reloadLoggerContext() throws JoranException {
// Hack to use system properties inside logback.xml
LoggerContext ctx = new LoggerContext();
ctx.reset();
new ContextInitializer(ctx).autoConfig();
}
}
玩就可以了!框架会将 application.home
导出为系统 属性 或环境变量。如果它不会发生(我不知道 Play! 好),那么你可以自己用这样的东西来做:
System.setProperty("application.home", app.configuration().getString("application.home"));