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

Tips

はじめに

あけましておめでとうございます。

年明けボケでブログをサボっていましたが、再開します。

突然ですが、皆様はターミナルクライアントは何を使用していますか?

私と同じく職種経験が長くない方や初学者の方は、WindowsだとTeraterm、Macであれば、純正のターミナルかIterm2などを使っている方が多いのではないのでしょうか。

Tera Term - Windows用端末エミュレータ
Tera TermはWindowsで動作する端末エミュレータで、telnet/ssh/シリアル接続に対応しています
iTerm2 - macOS Terminal Replacement
iTerm2 is a replacement for Terminal and the successor to iTerm

今回は、そのMacにおけるターミナルの自動ログ保存設定をするまでの奮闘を記事にしてみました。

サボった上に息抜き回みたいですが、どなたかのお役にたてれば嬉しいです。

とにかく結論を!という方は、目次から結論に飛んでください!

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

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

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

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

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

ansifilter
Homebrew’s package index

こちらを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

2024年2月7日追記

テキストエディタをcursorに移行したタイミングで突如動かなくなり調査したところ、export STARTED=yesを保持し続けて、ログ取得されなくなっていた。ターミナルAppだと問題ないので、VScodeなど統合ターミナルを使用すると発生した。trapコマンドにunset $STARTEDでyesをリセットすることで解決した。

まとめ

最後まで御覧いただきありがとうございました!!

今年はコンテナ、Kubernetes中心に学習進めていきます!

よろしくお願いします!

Console icon by Icons8

LOG icon by Icons8

コメント

タイトルとURLをコピーしました