user962206
user962206

Reputation: 16127

Play! Framework Logging only works on System Level

I am currently working with Play! Framework and It appears that logging is only working for play! only but for the classes that taht has LOGGER initialization does not work.

Here is the logback.xml

<!-- https://www.playframework.com/documentation/latest/SettingsLogger -->
<configuration>
  <conversionRule conversionWord="coloredLevel" converterClass="play.api.libs.logback.ColoredLevel" />
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${application.home:-.}/logs/application.log</file>
    <encoder>
      <pattern>%date [%level] from %logger in %thread - %message%n%xException</pattern>
    </encoder>
  </appender>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%coloredLevel %logger{15} - %message%n%xException{10}</pattern>
    </encoder>
  </appender>
  <appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="FILE" />
  </appender>
  <appender name="ASYNCSTDOUT" class="ch.qos.logback.classic.AsyncAppender">
    <appender-ref ref="STDOUT" />
  </appender>
  <logger name="play" level="INFO" />
  <logger name="application" level="INFO" />
  <!-- Off these ones as they are annoying, and anyway we manage configuration ourselves -->
  <logger name="com.avaje.ebean.config.PropertyMapLoader" level="OFF" />
  <logger name="com.avaje.ebeaninternal.server.core.XmlConfigLoader" level="OFF" />
  <logger name="com.avaje.ebeaninternal.server.lib.BackgroundThread" level="OFF" />
  <logger name="com.gargoylesoftware.htmlunit.javascript" level="OFF" />
  <root level="WARN">
    <!--<appender-ref ref="ASYNCFILE" />-->
    <appender-ref ref="ASYNCSTDOUT" />
  </root>
</configuration>

Here is the sample class that I have configured with a logging mechanism. Every time I try to execute this code. There is no logs that is coming out

package controllers.search

import javax.inject.{Inject, Singleton}
import play.api.Logger

@Singleton
class SearchController @Inject()(cc: ControllerComponents)
  extends AbstractController(cc) {


  protected val LOGGER: Logger = Logger(this.getClass())

  def search(q:String,
             card: String,
             lat: Option[String],
             lng: Option[String]) = Action {

    LOGGER.info("Searching "+card+" For "+q+" ")

}

I highly doubt that this is a dependency problem since every time my application boots up it shows me this message. I am assuming that my logging configured appropriately

[info] p.c.s.AkkaHttpServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

Server started, use Cmd+P to stop


[info] play.api.Play - Application started (Dev)

Upvotes: 2

Views: 1118

Answers (1)

Mario Galic
Mario Galic

Reputation: 48420

Try changing root logger level from WARN to INFO like so

<root level="INFO">
    <appender-ref ref="ASYNCSTDOUT" />
</root>

All loggers inherit from root logger and according to Logback docs:

If a given logger is not assigned a level, then it inherits one from its closest ancestor with an assigned level.

Here controllers.search.SearchController inherited WARN level from root, hence LOGGER.info messages were not logged.

We could also keep the root logger at WARN and change the level of just SearchController like so:

<logger name="controllers.search.SearchController" level="INFO" />
<root level="WARN">
    <appender-ref ref="ASYNCSTDOUT" />
</root>

Similarly, the reason why play logs were visible is due to following config already existing

<logger name="play" level="INFO" />

Upvotes: 3

Related Questions