yanom blog

様々な技術について書きます

docker上のアプリログ出力について

最近、docker/kubernetes 実践コンテナ開発入門を買って読んでいて、その中から知らなかったことを書きます。

ログについて

本ではdocker上でのアプリログは標準出力することが推奨されています。
理由としては、

  • アプリケーションでログローテートを考慮する必要がない。
  • ログ転送を補助する仕組み(logging driver)が整っている。

が挙げられています。

試してみる

以下のようなGoプログラムを作成し標準出力にログを出力します。

package main

import (
        "fmt"
        "log"
        "net/http"
)

func main() {
        http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
                log.Println("received request")
                fmt.Fprintf(w, "Hello!")
        })

        log.Println("start...")
        server := &http.Server{Addr: ":8088"}
        if err := server.ListenAndServe(); err != nil {
                log.Println(err)
        }
}

ホスト側で事前にコンパイルします。今回はgo-webというバイナリを作成しました。
次に、Dockerfileはこんな感じです。

from golang
ADD . /go/go-web
EXPOSE 8088
CMD ["/go/go-web/go-web"]

準備ができたらコンテナを実行していきます。

$ sudo docker build -t go-web . # build
$ sudo docker run -d -p 8088:8088 go-web # コンテナ実行

ブラウザからhttp://localhost:8088 にアクセスしてログを出力させます。
その後、/var/lib/docker/コンテナID/コンテナID-json.logを見てみると...

$ tailf /var/lib/docker/containers/0ea356f0d69dfa0a65119e905191aa1801cf45a54fe05126f1dd9bc6351eff1c/0ea356f0d69dfa0a65119e905191aa1801cf45a54fe05126f1dd9bc6351eff1c-json.log

{"log":"2018/09/04 23:35:24 start...\n","stream":"stderr","time":"2018-09-04T23:35:24.146451225Z"}
{"log":"2018/09/04 23:35:54 received request\n","stream":"stderr","time":"2018-09-04T23:35:54.041297044Z"}
{"log":"2018/09/04 23:35:54 received request\n","stream":"stderr","time":"2018-09-04T23:35:54.305731328Z"}
{"log":"2018/09/04 23:37:08 received request\n","stream":"stderr","time":"2018-09-04T23:37:08.57010539Z"}
{"log":"2018/09/04 23:37:08 received request\n","stream":"stderr","time":"2018-09-04T23:37:08.7003685Z"}
{"log":"2018/09/04 23:37:11 received request\n","stream":"stderr","time":"2018-09-04T23:37:11.240585718Z"}
{"log":"2018/09/04 23:37:11 received request\n","stream":"stderr","time":"2018-09-04T23:37:11.365455718Z"}

ブラウザからアクセスする度に、アプリの標準出力がログとして出力されていることが分かると思います。
また、ホストに出力されたjsonファイルはdockerの設定でログローテートすることも出来ます。

まとめ

ここでは、docker上の標準出力したログをホスト側で確認する方法を見てきました。
本ではその他にもFluentd/Elasticsearch/kibanaを使ったログ収集/可視化やkubernetesでのロギングについて触れています。
興味のある方は是非買って読んでみてください!