この記事は、技術系同人サークルふぃーるどのーつとのタイアップ記事です。
MackerelやDataDog、オンプレミスだとZabbixなど、サービス監視のためのサービスやミドルウェアは、ログファイル内のキーワードの出現を監視して、アラートを出力する機能を備えています。
これらの機能は概して、ログファイルの監視をファイルの行単位で行うようになっています。
しかし、下の図のようにプログラムのスタックトレースは複数行をまとめて出力するため、監視の条件を設定する上で複数行をまとめて読み込む必要がある場合があります。
以下は、アトラシアン社のJira Software(以下Jira)で、JSON 形式でのログ出力を行い、ログの1 レコードを1 行に集約して出力する設定例です。
設定
log4j-jsonの配置
Jiraはログの出力ライブラリーとしてlog4jを使用しているため、log4jでJSON形式でのログ出力を行うためにmichaeltandy/log4j-json を使用します。MavenのセントラルレポジトリーからJarファイルをダウンロードして、(Jiraのインストールディレクトリー)/atlassian-jira/WEB-INF/lib
に配置します。
log4j.properties
log4jの設定ファイルを編集します。(Jiraのインストールディレクトリー)/atlassian-jira/WEB-INF/classes/log4j.properties
を以下の通り編集します。
23行目近辺にlog4j.rootLogger=WARN, console, filelog
という記述があるので、以下の通り編集します。
log4j.rootLogger=WARN, console, filelog, watchlog
末尾に以下の記述を追記します。
log4j.appender.watchlog=org.apache.log4j.FileAppender log4j.appender.watchlog.layout=uk.me.mjt.log4jjson.SimpleJsonLayout log4j.appender.watchlog.File=/var/atlassian/application-data/jira/log/jira.log.json log4j.appender.watchlog.layout.ConversionPattern=%d %t %p %X{jira.username} %X{jira.request.id} %X{jira.request.assession.id} %X{jira.request.ipaddr} %X{jira.request.url} [%q{2}] %m%n log4j.appender.watchlog.MaxFileSize=20480K log4j.appender.watchlog.MaxBackupIndex=5 log4j.appender.watchlog.DatePattern=.yyyy-MM-dd
サービスの再起動
Jiraのサービスを再起動します。
ログの出力
以上の設定を行うと、以下のようなログが出力されます。
監視の設定例
以下は、監視サービス Mackerel のチェック監視の仕組みを使って、ログのスタックトレース内にClientAbortException
という文字列が含まれる場合は監視から除外するmackerel-agent.conf
の設定例です。
[plugin.checks.jira_log] command = """ check-log \ --file \ /var/atlassian/application-data/jira/log/jira.log.json \ --pattern ERROR --exclude ClientAbortException --return """ prevent_alert_auto_close = true
お知らせ
以上は、2018/4/22に開催される技術書典4に出品する新刊「すいーとみゅじっく vol.5 Mackerelではじめる お手軽サーバー監視」にて、題材として取り上げたJiraでのJSON形式でのログ出力について、設定の詳細を記したものです。
同書では、JiraとバックエンドにPostgreSQLを使用したWebシステムを題材として、 MackerelによるWebサービスの監視のノウハウについて述べています。筆者の現場でのアトラシアン製品の運用の経験がもとになっていますので、アトラシアン製品の監視のケーススタディーとしても使えると考えています。