ターミナルのログを記録する方法といえばscriptコマンドだが、タイムスタンプを付与できなかったりSyslogに記録できなかったり、いろいろとかゆいところに手が届かないことが多い。 タイムスタンプやらは無理やり設定できなくもないけど、あまりいい方法とも言えず、何かいい方法とかツールがないかと調べていたところ、『tlog(GitHubはこちら)』というターミナルのI/OログをSyslog形式で記録するツールを見つけた。

ターミナルの内容はJSONで記録されるため、ファイルを直接見ることで内容を確認することもできるし、GraylogなどのSyslogサーバ側に転送してやることもできそうだ。 なお、今回はインストール先としてCentOS 7を用いている。

1. インストール

『tlog』のインストールは、以下のコマンドで前提となるパッケージを導入してソースをダウンロード、コンパイルしてやるといい。

yum install -y libtool autoconf git json-c-devel libcurl libcurl-devel
git clone https://github.com/Scribery/tlog
cd tlog
./configure --prefix=/usr --sysconfdir=/etc && make
sudo make install
ln -s /usr/lib/libtlog.so.0 /lib64/

インストールが完了すると、「tlog-rec」「tlog-play」という2つのコマンドが出来上がる。 名前の通り、「tlog-rec」でログを記録、「tlog-play」で指定されたログを再生してくれる。

2. ターミナルのログを記録する

以下のようにtlogコマンドを実行してやることで、ターミナルのログを記録できる。 デフォルトではSyslog(出力先は/var/log/secure)に記録される。

tlog-rec

ログには、以下のように記録されている。

[root@BS-PUB-CENT7-01 ~]# tail -F /var/log/secure
Jan 15 16:14:36 BS-PUB-CENT7-01 tlog: {"ver":1,"host":"BS-PUB-CENT7-01.blacknon.local","user":"root","term":"xterm","session":3,"id":4,"pos":705997,"timing":"=95x3357+30455+14455+16855","in_txt":"\u0003\r\r\r","in_bin":[],"out_txt":"^C\r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# \r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# \r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# \r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# ","out_bin":[]}
Jan 15 16:14:37 BS-PUB-CENT7-01 tlog: {"ver":1,"host":"BS-PUB-CENT7-01.blacknon.local","user":"root","term":"xterm","session":3,"id":5,"pos":707533,"timing":"=95x331+2561+1041+1931+2238","in_txt":"exit\r","in_bin":[],"out_txt":"exit\r\nexit\r\n","out_bin":[]}
Jan 15 16:14:52 BS-PUB-CENT7-01 tlog: {"ver":1,"host":"BS-PUB-CENT7-01.blacknon.local","user":"root","term":"xterm","session":3,"id":1,"pos":0,"timing":"=95x33+13>61+11491+721+631+1291+1761+391+1452+3>821+6771+2471+731+1761+1528","in_txt":"ls -la\rexit\r","in_bin":[],"out_txt":"\u001b]0;root@BS-PUB-CENT7-01:~\u0007\u001b[?1034h[root@BS-PUB-CENT7-01 ~]# ls -la\r\n合計 48\r\ndr-xr-x---.  5 root root 4096  1月 15 15:08 \u001b[0m\u001b[01;34m.\u001b[0m\r\ndr-xr-xr-x. 17 root root 4096  1月  1  2016 \u001b[01;34m..\u001b[0m\r\n-rw-------.  1 root root 1241  1月 15 16:14 .bash_history\r\n-rw-r--r--.  1 root root   18 12月 29  2013 .bash_logout\r\n-rw-r--r--.  1 root root  176 12月 29  2013 .bash_profile\r\n-rw-r--r--.  1 root root  176 12月 29  2013 .bashrc\r\n-rw-r--r--.  1 root root  100 12月 29  2013 .cshrc\r\ndrwxr-----.  3 root root   18  1月 15 14:38 \u001b[01;34m.pki\u001b[0m\r\n-rw-r--r--.  1 root root  129 12月 29  2013 .tcshrc\r\n-rw-------.  1 root root  986  1月  1  2016 anaconda-ks.cfg\r\ndrwxr-xr-x. 10 root root 4096  1月 15 15:06 \u001b[01;34mtlog\u001b[0m\r\n-rwxr-x---.  1 root root 2494  1月 15 15:08 \u001b[01;32mtlog.log\u001b[0m\r\ndrwxr-xr-x. 10 root root 4096  1月 15 14:48 \u001b[01;34mtlog_old\u001b[0m\r\n\u001b]0;root@BS-PUB-CENT7-01:~\u0007[root@BS-PUB-CENT7-01 ~]# exit\r\nexit\r\n","out_bin":[]}

通常だとセッションが切れたタイミングでログへの書き込みが行われるようだ。 ログへの書き込みのタイミングを早める場合は、「--latency=N」オプションで書き込み頻度を指定することが可能。

また、以下のようにコマンドを実行することで、指定したファイルへの書き込みも行える。

tlog-rec --writer=file --file-path=出力先PATH

3. ターミナルのログを再生する

ターミナルのログを再生する場合は、以下のように「tlog-play」コマンドを実行してやればよい。

tlog-play --reader=file --file-path=ログファイルPATH

コマンド実行と同時に、ログに記録されている操作がそのままターミナル上で再生される。 細かい動きについては、こちらの動画を見るとわかりやすい。

触ってみた限り、結構よさそうだ。 ログイン時に自動的にターミナルのログをファイルに出力するようにしてやれば、あとから操作ログを追うこともできるだろう。

実行コマンドを監視するだけだったらSnoopy Loggerの方が適していると思うが、catで開いたときの出力などターミナル自体の操作ログを記録したい場合はこっちだろうか。