panlog

panlog というのを作って使っています。

tanlog - 兼雑記 — https://shinh.hatenablog.com/entry/2017/02/12/031105 の tanlog をもじって、 tmux の pane のログを録る、ということで、 panlog です。ディレクトリ構成は、ほぼ GitHub - omakoto/zenlog — https://github.com/omakoto/zenlog のものを頂きました。

インストール使い方は以下です。

インストール

以下のように、例えば ~/c/stuff/panlog を作るとして。

% mkdir ~/c/stuff/panlog
% cd $_
% git clone https://git.sr.ht/~hchbaw/panlog

~/.zshrc には、 autoload -Uz panlog-init && panlog-init を追加します。

panlog-init はデフォルトで、 panlog-startpreexec フックに登録するので、常にログが保存されることになります。常に保存されるのは困る(パスワード等を保存したくない)ので、カスタマイズできるように、 preexec フックに登録する関数を取ります。私の場合、以下のように panlog-start-maybe を呼ぶようにしています。

if [[ -n "${TMUX-}" ]]; then
  fpath[1,0]=~/c/stuff/panlog/panlog
  autoload -Uz panlog-init
  panlog-init panlog-start-maybe

  fpath[1,0]=~/c/stuff/panlog/misc
  autoload -Uz panlog-start-p
  panlog-start-maybe () {
    if panlog-start-p "$@"; then
      panlog-start "$@"
    else
      panlog_logfile=
    fi
  }
  alias nopan=nopanlog

  nopanlog () "$@"
  compdef _precommand nopanlog
fi

panlog-start-p は以下です。

#!zsh

panlog-start-p () {
  setopt localoptions extendedglob

  case "$1" in
    ([[:space:]]#nopan(log)#([[:space:]]##*|(#e)))
      return 1 ;;
    ([[:space:]]#ssh([[:space:]]##*|(#e)))
      return 1 ;;
    ([[:space:]]#tmux[[:space:]]##attach([[:space:]]##*|(#e)))
      return 1 ;;
  esac
  return 0
}

panlog-start-p "$@"

使い方

/var/tmp/panlog の下にログファイルを作ります。ここを hash -d しているので、インタラクティブシェルでは、 ~pan で参照できます。

~pan/var/RAW/2006/01/02/2006-01-02T13:04:05,00+07:00

ログの実体です。テンポラリファイルに tmux pipe-pane cat をリダイレクトして、最後に ln してテンポラリファイルを削除しています。

~pan/var/SAN/2006/01/02/2006-01-02T13:04:05,00+07:00

上記ファイルをエスケープシーケンスを処理して (pan-san.zsh) 作成しています。 tmux に描画させて capture-pane -p しています。

~pan/S

上記ファイルの最新版へのソフトリンクです。

~pan/SS...

一つ前のファイル… と続いて、 S が 10 ヶまでをローテートしています。

~pan/R...

ログの実体へのソフトリンクです。 S と同様に、 10 ヶまで。

~pan/cmds/make

make コマンド毎の出力です。上記同様 ~pan/cmds/make/{R,S,var} があります。

~pan/%/$TMUX_PANE

$TMUX_PANE 毎の出力です。同じようなコマンドは、同じ $TMUX_PANE で実行することが多いかもしれない、と思って置いてあります。ここを hash -d して ~pam で参照できるようにしています。 ~pam/{R,S,var} があります。

例えば実際に、最近 firefox-latest をダウンロードしたのは、と awk でザックリと、

% awk 'FNR == 1 && !/firefox-latest/ { nextfile; }
/^Location:/ { print $2; exit; }' ~pan/cmds/curl/S*
https://download-installer.cdn.mozilla.net/pub/firefox/releases/107.0/linux-x86_64/en-US/firefox-107.0.tar.bz2

という感じで、結構雑なスクリプトで欲しいデータを抜き出したりしています。


最後に。

過去に、作業した出力で欲しい情報が tmux や、ターミナルのスクロールバッファに残っていて助かった、ということがよくあったりするのだけれども、それらが常に残っている、というのはやはり心強いな、と思っています。