この記事は ウェブクルー Advent Calendar 2020 15日目の記事です。
昨日は @piwi さんの「 私的Nuxt.jsでサイト制作したときに悩んだ&悩んでること(コーダー) 」でした。
はじめに
普段はサーバー側の実装をしている人間です。多少フロントも触る機会があります。直近ではscala,java,nuxtjsなどやっています。
ちょうどいいネタが思いつかなかったので最近、環境の設定でちょっと困ったこととその対応について書きます。
ログの出力とローリング設定
環境
CentOS
Docker + Playframework(scala) + Logback
課題:新環境でのツールをリプレイスするにあたって、本番・開発環境設定の一環でログファイルの出力設定をしたい。
前提:stdoutでのログ確認は実装時に既にできている。ログ出力はLogback(デフォルト)
最初にやったこと
- logback.xmlでログのファイル出力設定を変更
- docker-compose.ymlに出力先のフォルダのマウント設定追加
↓追加、変更内容(なお、変更前のxmlファイルはplayframeworkで初期化した時に自動で生成されたlogback.xmlほぼそのまま)
<property name="LOG_HOME" value="/home/appserver" />
<appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_HOME}/logs/rolling_application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- Daily rollover with compression -->
<fileNamePattern>${LOG_HOME}/logs/application-log-%d{yyyy-MM-dd}.gz</fileNamePattern>
<!-- keep 90 days worth of history -->
<maxHistory>90</maxHistory>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss ZZZZ} [%level] from %logger in %thread - %message%n%xException</pattern>
</encoder>
</appender>
<appender name="ASYNCFILE" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="ROLLING" /> <!-- 変更 -->
</appender>
<root level="WARN">
<appender-ref ref="ASYNCFILE" /> <!-- 変更 -->
<appender-ref ref="ASYNCSTDOUT" />
</root>
version: '3'
services:
play-runtime:
image: play-runtime:latest
container_name: play-runtime
restart: always
ports:
- "9000:9000"
stdin_open: true
volumes: <!-- 追加 -->
- ./logs:/home/appserver/logs <!-- 追加 -->
確認のため、自前のPCにてログのローリング設定を分単位にして問題がないか試した。
ローカルで動作確認して問題がなかったので開発環境へアップしたところ、ログが出力されず頭をひねる。
ちなみに、分単位でファイルを切り分けるにはfileNamePattern末尾を%d{yyyy-MM-dd}
から%d{yyyy-MM-dd-HH-mm}
みたいにしてやればいい。
発生していたと思われる問題
該当のlogフォルダはできていたのに、ファイルは出力されなかった。
以下の記事を参考に、フォルダの所有者権限がネックになっていると予想。
ちなみに、dockerでは一般ユーザー(ユーザー名appserver)を作成してコンテナとアプリケーションを起動している。
https://qiita.com/yohm/items/047b2e68d008ebb0f001
RUN groupadd --gid 1001 appserver \
&& useradd --gid 1001 --uid 1001 -m appserver
USER appserver
対応
Dockerfil内でフォルダを作成するコマンドを追加。
RUN mkdir -p -m 777 /home/appserver/logs \ # 追加
&& chown appserver:appserver /home/appserver/logs
無事ログ出力が確認できた。
参照記事のようにアプリケーションの起動スクリプトで作成してもよいと思われる。
試してうまくいかなかった対応
参考程度に。
Dockerfile内でユーザー切り替え前にディレクトリ作成→一般ユーザーに所有権限を与える
chmod,chown両方を試してみたが、コンテナを起動した後execにて権限を確認したところ、rootユーザーのみに所有・書き込み権限が与えられておりログ出力はできなかった。
また、なぜローカルの環境で問題なかったかというと、どうやら docker for macだと勝手に権限を良きようにしてくれるらしく、他にも同じようにMacの環境だとうまく行くのにlinuxだとダメ!みたいに記事を書いている人がいた。
明日は@ee4839さんです!よろしくお願いします。