Posted at

scriptなどでログを取るときに変な文字(制御文字)のない状態で読めるようにする

More than 3 years have passed since last update.


Linuxクライアントでログを取ると辛い

TeraTerm使ってますか?私は使ってません。仕事では使わされますが()

Windowsアプリでやるのが嫌なので脱TeraTermするためにLinuxでなんとかしてるんですが、

作業ログをきれいにとるという点においてはTeraTermのほうが上なので苦しんでます。

一応scriptコマンド使ったりtmuxでログを取る方法などがあるんですが

どうしても制御文字が入ってしまう…

スクリプトは 2016年04月17日 22時52分01秒

に開始しました^[]0;user@host: ~^Guser@host:~$ fish
^[]0;fish /home/user^G^[[30m^[(B^[[mWelcome to fish, the friendly interactive shell
Type ^[[32mhelp^[[30m^[(B^[[m for instructions on how to use fish
^[]0;fish /home/user^G^[[30m^[(B^[[m^[[38;5;245m⏎^[[0m $
^[[30m^[(B^[[m^[]0;ping /home/user^G^[[30m^[(B^[[mPING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=116 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=70.9 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=44 time=90.0 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=44 time=230 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 70.970/126.856/230.065/61.728 ms
^[]0;fish /home/user^G^[[30m^[(B^[[m^[[38;5;245m⏎^[[0m $
^[[30m^[(B^[[m^[]0;exit /home/user^G^[[30m^[(B^[[m
^[[30m^[(B^[[m^[]0;user@host: ~^Guser@host:~$ exit
exit

スクリプトは 2016年04月17日 22時52分24秒
に終了しました



置換しない

catして綺麗に読めることもあるのですが、リダイレクトして別ファイルにするとやっぱり制御文字が残っていたりするので

ここはsedしたほうがいいとはおもうのですがいろんな文字などがあって想定するのは厄介だなぁと思いまして。

表示するときだけ気をつければいいのではということで以下の方法でやりすごせるそうです。

Screen のログ機能とログファイルの閲覧

Man page of LESS


-r または --raw-control-chars

「そのままの」制御文字を表示させるようにする。 デフォルトでは、制御文字をキャレット表記を使って表示する。 例えば、control-A (8 進数 001) は "^A" と表示される。 警告: -r オプションが指定されると、 less は (制御文字のタイプにどのように画面が反応するかに依存しているために) 画面の実際の状況の経過を追うことができない。 よって多くの場合、長い行が誤った位置で分割されてしまうといった問題が生じる。

-R または --RAW-CONTROL-CHARS

-r と似ているが、可能な場合には画面表示を正しく維持しようとする。 このオプションが有効なのは、入力が通常のテキストの場合である。 入力には ANSI の「カラー」エスケープシーケンスが含まれていてもよい。 このシーケンスは

ESC [ ... m

のような形式で、"..." は "m" 以外の 0 個以上の文字である。 画面の状況を保つため、 全ての制御文字と ANSI カラーシーケンスは カーソルを移動させないと仮定している。 less に "m" 以外の文字を ANSI カラーエスケープシーケンスの終了文字として認識させることもできる。 そのためには、認識させたい終了文字のリストを 環境変数 LESSANSIENDCHARS に設定すればよい。


なのでこれからはscriptコマンドで記録したログはlessの-rや-Rオプションで開くようにしましょう。



補足的な

Unix環境オンリーなら上記のようにやり過ごせるのですが、仕事柄どうしてもWindowsを強制されるので

なにかいい方法があればなぁと思ってはいるのですが、bashとかが前提なのでfishに落としこむ方法がわからないままです...

GentooInstallBattleなんかした日にはコピペでひとつずつ移すよりもきついことに...



他の参考

tmuxを使いながらログを取る

続・ラフなラボ – tmux 内で SSH した時のロギングを自動でやる

そもそもまともにログが取れなかったのですが、Save complete historyで取る方法もあるそうです

tmux-plugins/tmux-logging: Easy logging and screen capturing for Tmux.