Linuxのコンソール操作ログを残す

ITブログ

Linuxコンソールの作業記録を残そうと思うと、script コマンドを使うことがまず真っ先に思いつきますが、script コマンドで取ったログって、中にカラーコード等が入るので cat で見る分には良いのですが、テキストエディタで開くと、とても読めたものじゃないんですよね。

なので、操作ログを script で記録して、カラーコードやエスケープシーケンスを除去した整形テキストを出力するシェルスクリプト「opelog.sh」を作りました。

シェルスクリプト opelog.sh の使い方

1.後述する「opelog.sh」を任意の場所に配置します。

2.作業記録を開始したいタイミングで「opelog.sh」を実行します。

$ opelog.sh [(任意オプション)ログファイルに付与する名前]

3.これで記録が開始されますので、作業を開始します。作業が終了したら「exit」で終了します。

4.${HOME}/log に script が出力したカラーコード入りのログが、${HOME}/log/formated にカラーコード等を除外したログが格納されます。catでログをコンソールに表示する時には前者を、テキストエディタで見るときは後者を使ってください。
ログのファイル名は、以下のようになります。(YYYYMMDD_HH-MM-SSはコマンド実行日時が入ります)
<引数なし>
 ・カラーコード入り:${HOME}/log/YYYYMMDD_HH-MM-SS_operation.log
 ・カラーコードなし:${HOME}/log/formated/formated_YYYYMMDD_HH-MM-SS_operation.log
<引数あり(例:記録テスト)>
 ・カラーコード入り:${HOME}/log/YYYYMMDD_HH-MM-SS記録テスト_operation.log
 ・カラーコードなし:${HOME}/log/formated/formated_YYYYMMDD_HH-MM-SS記録テスト_operation.log

opelog.sh の内容

#!/bin/bash
#################################################
#
# record the operation log.
#
# オペレーションログを記録します。
# オペレーションログは、scriptコマンドを使用して${HOME}/log/に出力されます。
# scriptが出力するログはカラーコード等のエスケープシーケンスを含んだデータですので、
# cat等でコンソールに表示を行うと正しく表示されますが、vi等のテキストエディタで表示を行うと
# カラーコードまで表示され、読みにくいものとなります。
# カラーコード等のエスケープシーケンスを除外したファイルは${HOME}/log/formatedに出力されます。
#
# param1: log-name(optional)
#
# 既知の問題
# formatedに出力される内容は不完全なものになることがあります。
# 入力した文字を[DEL]で削除した場合、削除した残骸が残ってしまうことがあります。
#################################################

logdir="${HOME}/log"
logdir_formated="${HOME}/log/formated"


function format_logfile() {
        input=${logdir}/$1
        if [ ! -d ${logdir_formated} ];then
                mkdir ${logdir_formated}
        fi
        cat ${input} | ansi2txt | iconv | col -b >> ${logdir_formated}/formated_$1
# ansi2txtがインストールされていない場合は、上の行をコメントにして下の行を有効にしてください。
# sedによる変換を行います。ただし、ansi2txtを利用する場合に比べて、変換の正確性は劣ります。(BackSpaceで消した文字が残ってしまいます)
#       cat ${input} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | iconv >> ${logdir_formated}/formated_$1
}


if [ ! -d ${logdir} ];then
        mkdir ${logdir}
fi
if [ ! -d ${logdir_formated} ];then
        mkdir ${logdir_formated}
fi

optional_name=""
if [ $# -ge 1 ];then
        optional_name="_"$1
fi

logfile="`date +%Y%m%d_%H-%M-%S`${optional_name}_operation.log"
touch ${logdir}/${logfile}
script ${logdir}/${logfile} && format_logfile ${logfile}

シェルスクリプトの作成手順

$ cd [任意の場所]
$ vi opelog.sh
  … 上のソースコードを貼り付け …
$ chmod +x opelog.sh

ロジックの解説

cat ${input} | ansi2txt | iconv | col -b >> ${logdir_formated}/formated_$1

scriptコマンドが記録した、カラーコード等の制御文字が入ったログファイルから、ansi2txt・iconv・colを使って、カラーコード等の制御文字を削除する処理です。

この処理で使っている「ansi2txt」は、インストールされていない環境も多いかと思います。
もしansi2txtがない場合は、制御文字の除去精度は落ちてしまいますが、sedで代替するロジックを用意しました。
上のロジックをコメントアウトし、下のロジックを有効化(コメントアウト外す)してください。

#       cat ${input} | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" | iconv >> ${logdir_formated}/formated_$1

注意点(既知の問題)

formatedディレクトリに出力される整形ファイルは、完全ではありません。

作業中に[BackSpace]や[Del]キーで文字を消した場合に、削除した文字がログに残ってしまう場合があります。

もしかすると ansi2txt コマンドのバージョンによるものかもしれません。

コメント

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