byClassmethod検索AWSAlexaモバイルビッグデータサーバーレスTableauAlteryxイベント[Mackerel]ログローテーション運用時のログ監視で抑えておきたい「State」オプションMackerel監視2020年02月10日hayashi.masaya(3)20はじめにこんにちは。大阪オフィスの林です。みなさま、AWSの監視に何を使っていますでしょうか?弊社ではMackerelを利用した監視オプションサービスを提供しています。今回の記事ではMackerelを使ったログ監視における「State」という概念を検証交えてまとめておきたいと思います。ログ監視について下記の記事も併せてご覧頂ければと思います。「State」とは?Mackerelでは「State」オプションを使う(デフォルトで有効)ことによって、ログのチェック完了位置(バイト数)を「stateファイル」に出力し記録しておき、次回以降は前回チェック完了位置(バイト数)以降の出力差分に対して、ログのチェックを実施することが出来ます。これは常に追記され続けるログファイルに対しては何も問題ないと思います。世の中のシステムでは常に追記され続けるログファイルがある一方で、何かしらの方法でログのローテーションを行っているシステムも多くあります。ログのローテーションが行われた際の挙動についても説明していきたいと思うのですが、「Stateファイル」にはもう一つ重要な情報が記録されているのでそちらを先に説明したいと思います。「Stateファイル」には「ログのチェック完了位置(バイト数)」に加え、もう1つ重要な情報が記録されます。それは「inode(アイノード)番号」です。「inode番号」とはファイルの属性情報などをまとめたデータです。「State」オプションを使ったMackerelのログ監視では「mackerel-agent.conf」で記載した設定および、この「inode番号」を含む「Stateファイル」を使いながらログ監視を行います。Mackerelの「Stateファイル」まとめMackerelの「Stateファイル」では次の2つの情報を記録しています。「skip_bytes」という情報を記録しログのどこまでチェックしたかを記録しています。次回以降は記録したbyte数をスキップしてチェックを始めます。「inode番号」を記録し、どのファイルをチェックしたか(するか)を記録しています。ログローテーションのパターン「Stateファイル」の説明が終わったのでログのローテーションが行われた際の挙動についても説明していきたいと思います。今回は2つのログローテーションのパターンを取り上げます。ここでは1つを「リネームパターン」と呼び、もう1つを「コピーパターン」と呼ぶこととします。リネームパターンもとのログファイル名をリネームし、もとのログファイル名で再度ファイルを新規作成することでローテーションをしているパターンです。コピーパターンもとのログファイルを別名でコピーします。次にもとのログファイルの中身を初期化することでローテーションをしているパターンです。プロセスは少し違うものの結果としては同じことをしているように見えます。前述した「inode番号」という視点で見てみると全く異なるのです。続いてMackerelのログ監視の挙動と併せて確認していきます。ログローテーション時のログ監視の挙動リネームパターン(inodeの視点を入れる)リネームパターンの場合、inode番号はリネーム後も継承されます。ログを再作成した際に、同じファイル名でもinode番号が異なって作成されます。mackerel-agent.conf内の設定確認です。/home/ec2-user/test.logの中身でerrorという文字があるかどうかを監視する設定です。true実際のtest.logのinode番号を見ていきましょう。-iでinode番号を確認することが出来ます。今回の場合13360227がinode番号となります。test.log次にMackerelで持っている「stateファイル」に記録されている情報を見ていきます。「stateファイル」はデフォルトで/var/tmp/mackerel-agent/check-log/配下にあります。check-log以降は実際のログのパスと同じパス(今回の場合は/home/ec2-user/)でディレクトリが切られます。下記の結果の場合、27バイトは次回スキップするという情報と、inode番号13360227が監視の対象ファイルであることが分かります。/var/tmp/mackerel-agent/check-log/home/ec2-user/test.log-b80d3f843b6e93c6d5ba4b22e0d5747a.json{"skip_bytes":27,"inode":13360227}リネームしてみますが、リネームしてもinode番号が変わらないということが分かります。test.log.001ファイルを新規作成すると同じ名前でもinode番号が変わるということが分かります。test.logMackerelでは「ログローテーションが発生していないか否か」を「stateファイルに保存されたinode番号とファイルパスで指定されるファイルのもつinode番号の一致」を確認する形で毎回実施しています。stateファイルに保存されたinode番号とファイルパスで指定されるファイルのもつinode番号が不一致の場合、ログファイルのinode変更を検知して、ローテーションされたファイルをinode番号で特定し、そのファイル末尾までのチェックを実施します。よってリネームパターンでログがローテーションされる場合、監視周期が来て次の監視周期が来る前にログがローテーションされてしまっても、ローテーションされたファイルを漏れなくチェックすることが出来ます。コピーパターン(inodeの視点を入れる)次にコピーパターンを見ていきます。コピーパターンの場合、ローテーションされたファイルのinode番号はコピー時に別の番号が付与されます。ファイルには何も変更を加えていないので、元のファイルのinode番号は変わりません。mackerel-agent.conf内の設定は先ほどと同じです。「stateファイル」を見てみます。13バイトは次回スキップするという情報と、inode番号13360193が監視の対象ファイルであることが分かります。~]$コピーの場合、コピーした先のファイルのinode番号は変わりますが、もともとのログファイルのinode番号が変わらないということが分かります。test.log.001次に「stateファイル」も見てみますが、先ほどの状態から変化はありません。/var/tmp/mackerel-agent/check-log/home/ec2-user/test.log-b80d3f843b6e93c6d5ba4b22e0d5747a.json{"skip_bytes":13,"inode":13360193}このケースの場合、監視周期が来て次の監視周期が来る前にログがコピーでローテーションされてしまった場合、ローテーション先のログを監視することが出来ません。Mackerelからも下記が注意点として挙げられています。方式のログローテーションには対応していません。ローテーション時にログファイル自身のコピーをおこない、ログファイルのリセットを行う場合、ログファイル自身のinode番号は変わらないため。まとめひとことに「ログ監視」と言っても色々なケースが世の中には存在しており、その中で要件や制約を考えながらより最適なアーキテクチャを見つけていかなければと感じた時間でした(Mackerelに限らず)。リモート】クラスメソッドの会社説明会を開催しますクラスメソッドでは、AWS・AI・ビッグデータ・モバイルなどの技術職や営業のメンバーとして一緒にお仕事をする仲間を大募集しています。#cmdevio新型コロナウイルスの感染拡大を受け、本イベントを延期させていただくことになりました(開催時期未定)。お申し込みいただいた皆様には大変申し訳ございませんが、何卒ご理解いただけますようよろしくお願いいたします。AWSについてライトに色んな情報交換をしましょう。カフェ店長のオカノです。今日はオフィスに用があるので、通勤ラッシュを避けて出社しました。この子は新メンバーのさめくんです。在宅勤務が推奨されているのでオフィスが閑散としており、すこしさみしそうです。夏目祐樹147こんにちは、CX事業本部の夏目です。MacのタッチバーのタッチIDが非常に便利なのですが、Terminalでsudoを叩かないと行けないときに使えたらなぁと思ったので、情報を共有します。タイトルがすべてなのですが、社内で「登壇勉強会」が開催されたので、「登壇は最強の生存戦略である」というタイトルで登壇しました。本が出ていたので読んでみたところよかったので紹介させていただきます。臼田佳祐295ワークフロー自動化OSSのn8nをAWS環境で建てて検証してみました。非常に期待できるサービスです。Fargateの勉強をしています。使ってみたい方は参考にしてください。洋介255SnowflakeがAWSの東京リージョン上で稼働するようになりました。データを日本に置けます。芳賀健233こんにちは!猫様の忠実なるしもべ、芳賀健です。Tokyoで開催されました。カフェ店長のオカノです。クラスメソッド株式会社が運営するAWS・iOS・HTML5に関する技術情報サイトです。