KOS.LOG
tech

2024年M1Macbook【script&ANSI制御文字除去】ターミナルのログを自動保存したい

  • #mac
  • #terminal
  • #script
  • #ansifilter
  • #zsh

はじめに

あけましておめでとうございます。 年明けボケでブログをサボっていましたが、再開します。

突然ですが、皆様はターミナルクライアントは何を使用していますか? 私と同じく職種経験が長くない方や初学者の方は、WindowsだとTeraterm、Macであれば、純正のターミナルかIterm2などを使っている方が多いのではないのでしょうか。 Teratermでは、設定から簡単にログ保存ができますが、ターミナルはそう簡単にはいきません。

Tera Term iTerm2

今回は、そのMacにおけるターミナルの自動ログ保存設定をするまでの奮闘を記事にしてみました。 サボった上に息抜き回みたいですが、どなたかのお役にたてれば嬉しいです。 とにかく結論を!という方は、目次から結論に飛んでください!

まずは、どんな手法があるか検索

調べたところ以下のような手法があり一つずつ試していきました。

  1. ターミナルのプロファイル設定から、シェル起動時の実行コマンドにscriptコマンドを指定してログを書き出す。
  2. ターミナルの.bashrcや.zshrcなどにscriptコマンドで出力したいログファイルを指定して書き出す。
  3. iTermの標準機能で、ログ出力を有効化してローカルのフォルダを指定する。
  4. tmuxなどを用いて、詳細設定でログ出力する(ことができるらしい)

ほかにも手法はあったのですが、簡単な手法(1,2,3など)を採用しようとすると、ANSIの制御文字列が残る問題に直面していました。

catやlessコマンドであれば、ANSIを表示せずに見れるという記事もありましたが、、、どうしても除去したうえでVSCodeなどのテキストエディタでログファイルを閲覧したいと思い、調べ続けたところ、ANSIを除去できるツールを発見しました!その名もANSI filterです。

ansifilter(Homebrew)

こちらをhomebrewでインストールして、.zshrcに後述のように記載したところ、無事、ログファイルを自動保存できました。

結論

以下が実施した内容です。

  • .zshrcにscriptコマンドを記載して、コマンドをログファイルに出力する
  • それだけだとANSI制御文字が残ってしまうので、anisifilterをかけて除去する
  • シェルを終了する時は、2回Exitを叩いて抜ける

.zshrcに記載した内容

if [ -z "$STARTED" ]; then
  export STARTED=yes
  LOG_PATH_START="/Users/{ユーザー名}/{terminallogなど}/`date "+%Y-%m-%d_%H%M%S"`.log"
  script $LOG_PATH_START
  trap 'LOG_PATH_END="/Users/{ユーザー名}/{terminallogなど}/`date "+%Y-%m-%d_%H%M%S"`.log"; ansifilter -i $LOG_PATH_START -o $LOG_PATH_END; unset $STARTED' EXIT
fi

最後まで御覧いただきありがとうございました!! 今年はコンテナ、Kubernetes中心に学習進めていきます! よろしくお願いします!

LOG icon by Icons8