28 February 2012

端末出力のログを取る方法

端末ソフトのログ機能

たいていついている. 例えば iTerm だと Shell -> Log -> Start/Stop.

  • たいてい screen を使うとごちゃごちゃになる
  • 制御コードとかもそのまま出て見づらい

    ESC[36mDropboxESC[39m/ESC[16CESC[36mMusicESC[39m/ESC[18CaESC[23CESC[36mgitolite-adminESC[39m/ESC[9CESC[35mprojectsESC[39m@ESC[15CESC[36msrcESC[39m/
    Koseis-MBA:kosei%^MESC[35BESC[7m[11:12] 0 zsh  1 zsh  2 zsh  ESC[27mESC[1mESC[37mESC[44m3 zshESC[0mESC[7m                                                                                                                                                    ESC[6;18HESC[27m^MESC[35BESC[7m[11:12] 0 zsh  1 zsh  2 zsh  ESC[27mESC[1mESC[37mESC[44m3 zshESC[0mESC[7m                                                                                                                                                    ESC[6;18HESC[27m lll
    zsh: correct 'lll' to 'll' [nyae]? y
    total 168
    drwx------+  4 kosei  staff    136  2 25 15:52 ESC[36mDesktopESC[39m/
    drwx------+ 13 kosei  staff    442  7 23  2011 ESC[36mDocumentsESC[39m/
    drwx------+ 67 kosei  staff   2278  2 24 22:07 ESC[36mDownloadsESC[39m/
    drwx------@ 12 kosei  staff    408  2 23 22:34 ESC[36mDropboxESC[39m/
    drwx------@ 48 kosei  staff   1632  2  9 08:20 ESC[36mLibraryESC[39m/
    drwxr-xr-x   3 kosei  staff    102 12  9  2010 ESC[36mMailESC[39m/
    drwx------+  8 kosei  staff    272  4  8  2011 ESC[36mMoviesESC[39m/
    drwx------+  5 kosei  staff    170  1  9  2011 ESC[36mMusicESC[39m/
    drwx------+  8 kosei  staff    272  9 25 15:33 ESC[36mPicturesESC[39m/
    drwxr-xr-x+  5 kosei  staff    170 12  7  2010 ESC[36mPublicESC[39m/
    drwxr-xr-x+  9 kosei  staff    306  7 31  2011 ESC[36mSitesESC[39m/
    -rw-r--r--   1 kosei  staff   1362  2 10 19:30 a
    drwxr-xr-x   9 kosei  staff    306  4 17  2011 ESC[36mbinESC[39m/
    -rw-r--r--   1 kosei  staff   3001 12 22 12:54 contestapplet.conf
    -rw-r--r--   1 kosei  staff   3001  2  8 12:57 contestapplet.conf.bak
    drwxr-xr-x   5 kosei  staff    170  2 25 10:47 ESC[36mgitolite-adminESC[39m/
    lrwxr-xr-x   1 kosei  staff     17  1 10  2011 ESC[35mjunkESC[39m@ -> Dropbox/memo/junk
    -rw-r--r--   1 kosei  staff   1760  2 27 11:12 logtest
    lrwxr-xr-x   1 kosei  staff     25 12  9  2010 ESC[35mmemoESC[39m@ -> /Users/kosei/Dropbox/memo
    drwxr-xr-x   3 kosei  staff    102  1  8 17:27 ESC[36mnode_modulesESC[39m/
    lrwxr-xr-x   1 kosei  staff     29 12  8  2010 ESC[35mprojectsESC[39m@ -> /Users/kosei/Dropbox/projects
    -rw-r--r--   1 kosei  staff  10866  2 27 11:11 screenlog.0
    -rw-r--r--   1 kosei  staff  41237  2 27 11:10 screenlog.2
    drwxr-xr-x   5 kosei  staff    170  5  8  2011 ESC[36mshareESC[39m/
    drwxr-xr-x  16 kosei  staff    544  2 14 16:46 ESC[36msrcESC[39m/
    ESC[K
    ESC[K
    ESC[K
    

screen のログ機能

C-a H でログ開始, その状態で C-a H でログ終了 (デフォルトのキーバインドの場合). ホームディレクトリに screen.n (n は screen のウィンドウ番号) というログファイルができる.

- screen のウィンドウ切り替えの影響は受けない - 制御コードがやはり見づらい

    ESC[0mESC[23mESC[24mESC[JKoseis-MBA:kosei% ESC[Kid^M
    uid=501(kosei) gid=20(staff) groups=20(staff),402(com.apple.sharepoint.group.1),401(com.apple.access_screensharing),12(everyone),33(_appstore),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),100(_lpoperator),204(_developer)
    ESC[0mESC[23mESC[24mESC[JKoseis-MBA:kosei% ESC[Kdate^M
    2012年 2月27日 月曜日 11時19分50秒 JST
    ESC[0mESC[23mESC[24mESC[JKoseis-MBA:kosei% ESC[Kll^M
    total 288
    drwx------+  4 kosei  staff    136  2 25 15:52 ESC[36mDesktopESC[39;49mESC[0m/
    drwx------+ 13 kosei  staff    442  7 23  2011 ESC[36mDocumentsESC[39;49mESC[0m/
    drwx------+ 67 kosei  staff   2278  2 24 22:07 ESC[36mDownloadsESC[39;49mESC[0m/
    drwx------@ 12 kosei  staff    408  2 23 22:34 ESC[36mDropboxESC[39;49mESC[0m/
    drwx------@ 48 kosei  staff   1632  2  9 08:20 ESC[36mLibraryESC[39;49mESC[0m/
    drwxr-xr-x   3 kosei  staff    102 12  9  2010 ESC[36mMailESC[39;49mESC[0m/
    drwx------+  8 kosei  staff    272  4  8  2011 ESC[36mMoviesESC[39;49mESC[0m/

script コマンド

$ script でログ開始, exit などで抜けると終了.

- 保存ファイル名などを引数で指定できる - あとは screen のログと同じ

col コマンド

line feed などをフィルタしてくれるコマンド. いくつかのエスケープシーケンスはこれでフィルタすればいい感じになりそう

$ cat logfile | col -bx

zsh

ちゃんと調べてないけど, zsh だといろいろエスケープシーケンスが入っちゃってるから, bash のほうがエスケープシーケンスが少ない

結論

作業をログしたいときは

1. bash にする 2. script [LOG_FILE_NAME] 3. col -xb でフィルタ

が, 一行もコードを書かなくて良くてよさそう.

コード書く場合は script を拡張して col のようなフィルタを入れる感じか.