zgrepによる圧縮されたサーバーログの検索

サーバーログファイルの保存と検索について

大抵のサーバーログは以下のように分割及び圧縮された状態で保存されていると思います。

production.log-20250507.gz
production.log-20250514.gz
production.log-20250521.gz
production.log-20250528.gz
production.log-20250604.gz
production.log-20250611.gz
production.log-20250618.gz
production.log-20250625.gz
production.log-20250702.gz

...

問題点

しかし、この保存方法はログの検索時に下記のような問題が発生します。

  • ログの場所(上記の例では期間)を絞れないとgunzipコマンドなどで総当たり解凍処理を行わないといけません。また解凍の為にファイルをコピーする作業が発生します。
  • 本番サーバーのディレクトリ内で直接解凍を行うと戻し忘れが発生する場合があり、戻し忘れたログファイルが不具合の原因となる可能性があります。

以下のコマンドを利用することで解凍コマンドを使わずにログを検索することが可能です。

zgrepコマンド

zgrep コマンドを使用することでgzip圧縮ファイルを検索することができます。手動で解凍することがないため戻し忘れも発生しません。

使用例

zgrep 'ActiveRecord' production.log-2025*.gz

# 以下、検索結果
production.log-20250604.gz:D, [2025-05-29T05:53:33.774313 #2961] DEBUG -- :   ActiveRecord::SchemaMigration Pluck (2.4ms)  SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC
production.log-20250604.gz:D, [2025-05-29T05:53:33.945838 #2961] DEBUG -- :   ActiveRecord::SchemaMigration Create (3.2ms)  INSERT INTO `schema_migrations` (`version`) VALUES ('20250507122206')
production.log-20250604.gz:D, [2025-05-29T05:53:34.102360 #2961] DEBUG -- :   ActiveRecord::SchemaMigration Create (2.1ms)  INSERT INTO `schema_migrations` (`version`) VALUES ('20250511153303')
production.log-20250604.gz:D, [2025-05-29T05:53:34.255674 #2961] DEBUG -- :   ActiveRecord::SchemaMigration Create (2.4ms)  INSERT INTO `schema_migrations` (`version`) VALUES ('20250511155415')
production.log-20250604.gz:D, [2025-05-29T05:53:34.280370 #2961] DEBUG -- :   ActiveRecord::InternalMetadata Load (2.4ms)  SELECT `ar_internal_metadata`.* FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' LIMIT 1

特徴

  • Amazon LinuxなどのOSに標準搭載されています。
  • grepコマンドと同じオプションを利用可能です。(渡されたオプションはそのままgrepに渡されます。)
この記事をシェア

弊社では、一緒に会社を面白くしてくれる仲間を募集しています。
お気軽にお問い合わせください!