Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Play Framework - Change the log file location

I use a external logback file uing "Dlogger.file" as follow,

.....    -Dconfig.file="C:\temp\application.conf" **-Dlogger.file="c:\temp\logback.xml"** -Dpidfile.path=NULL -Dhttps.port=443 -Dhttp.por ..............

and my logback.xml file looks lile this,

<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>

Instead of ${application.home} (in the logback.xml file) I want to replace it with a key defined in the application.conf like

application.logpath="c:/temp"

or in other words I want to define the log file location(path) in the application.conf.

like image 220
Hiran Avatar asked Jun 18 '15 03:06

Hiran


2 Answers

Add underneath <configuration>:

<property resource="application.conf" />

then use ${application.logpath}:

<file>${application.logpath}/application.log</file>
like image 173
bjfletcher Avatar answered Oct 16 '22 09:10

bjfletcher


The most simple way to achieve this would be:

...  -Dapplication.home="C:/temp/somedir" 

But unfortunately it appends one more parameter to your startup command.


The reason why your current solution doesn't work is simply because Logback configures itself during class loading, but it is the moment when your config.file is not loaded yet.

So to make it work you can use one little hack: re-initialize logback after startup:

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();
    }
}

It will work if Play! Framework will export application.home as system property or an environment variable. If it won't happen (I don't know Play! well), then you can do it by yourself with something like this:

System.setProperty("application.home", app.configuration().getString("application.home"));

like image 3
G. Demecki Avatar answered Oct 16 '22 09:10

G. Demecki