PHPerによるScala入門その4 ログ

ずいぶんと間が空いて4だけど気にしない。

ログ

Scalaで吐くApplication log. PHPだと最近はもうmonlog一択な印象を受ける。

テキトーにAkka Httpで作ったアプリケーションを動かしてると

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details

みたいなログが出てくることがある。 何も設定してないけど、Akkaがslf4jに依存してるのかな?

何も知識が無いのでぐぐってみると、

stackoverflow.com

というStack Overflowがあったり、入門者は困るんじゃないかなという空気を感じた。 というかまずPlayで入門していろいろ学んだ方が効率良いんじゃないのか…?

ともあれ、Stack Overflowの中でもslf4jがデファクトっぽいのでとりあえずこれの使い方を見ていく。

slf4sもあるようだけど GitHub - w11k/slf4s: Simple Scala facade for SLF4J

とりあえずすでにログも出てるし4jで進めていく。

SLF4J

SLF4J Manual

SLFってなんぞと思っていたけど、 Simple Log Facade なのね。

さて見ていくかと思ったのだけど、LightbendがScala Loggingというのを出していた。SLF4Jベースらしいし、Akkaを使ってるしLightbendに依存していこうということでこっちで見ていく。

github.com

Scala Logging

logbackscala loggingをlibraryDependenciesに追加して

com.typesafe.scalalogging.Logger("name").info(message)

もうこれだけでログが出ますね。かんたーん。

Logback

とりあえず使う分にはこれでいいのだけど、実際に調べたかったことはLogback. logback.xmlでなにかしらを設定すると何か変わる、ということは知ってるけど実際に何をどう設定するのか全然知らないので見てみる。

logback-test.xml, logback.groovy, logback.xml の順で読まれるらしい。classpath内に直接置いとけば勝手に読んでくれるよ、ということらしいけど、classpathとはどれのことを指してるんだろう…

Setting the class path

The class path is the path that the Java runtime environment searches for classes and other resource files.

ふむ、なるほど… とりあえずresrouceに置いとくか。

内容は

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- encoders are assigned the type
         ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <logger name="chapters.configuration" level="INFO" />
  <logger name="chapters.configuration.Foo" level="DEBUG" />

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>

大体こんな感じになるとのこと。

  • appender
  • logger
  • root

がある。rootは特別なloggerって感じかな。 appenderは出力方式を決めてるところに見える。 FILEに吐くなりSTDOUTに吐くなり。

logger, rootはfilterかな。

変数を使いたければpropertyで指定すればいいらしい。

なるほど、Logback完全に理解した()