先日、Tera Term(テラターム)のログ取得&ローテーションについて、以下のようなご質問をいただきました。
サーバ等に接続し取得しているログを一定間隔(日付等)でローテーションさせたい。接続をやり直すのは不可で、起動(接続)したまま人が操作することなくファイルを分割して保存したい。との事でした。
ちょっと考えてみましたが、当初Tera Termマクロの機能だけではちょっと無理かなと考えていました。
マウス・キーボードの操作を記録・再生できるようなPC自動化ソフトと組み合わせて実行すれば可能かと思っていたのですが・・・。
自己解決されたみたいで、実施内容を教えてもらうと・・・
Tera Termマクロの中で周期的に日時を比較し、日付が変わるとログファイルを再作成するようにしたとの事。
「周期的」にがキーワードでした。
私が作ったこれまでのマクロは、見てもらったらわかりますがサーバ等に接続してログ取得を開始するとマクロを終了するものが多くを占めています。これが原点にあったので頭でっかちになってたんですね。
結局以下のマクロで実現可能でしたので、ご参考までにご紹介します。
「そんなの簡単に出来るやん」とか言いっこ無しでお願いしますね。
サンプルでは、1時間単位にログローテーションさせています。
日単位にする場合は比較部分を修正する事で実現可能となっています。
自動ログローテーションマクロ(時刻単位でローテーション版)
;============================================ ; Filename : log_rotation.ttl ; Description : Auto Log Rotation ; Author : daihakuriki ; Created : 2012/11/10 ; modified : ;============================================ ;; 接続先ホスト/ユーザ名/パスワード設定 HOSTNAME = '192.168.xxx.xxx' USERNAME = 'ユーザ名’ PASSWORD = 'パスワード' ;; ログ保存先指定 LOGSPATH = 'C:\logs\’ ;============================================ ;; ①SSH接続 COMMAND = HOSTNAME strconcat COMMAND ':22 /ssh /2 /auth=password /user=' strconcat COMMAND strUSERNAME strconcat COMMAND ' /passwd=' strconcat COMMAND strPASSWORD connect COMMAND if result != 2 then messagebox 'It could not be connected.' 'Connected error' end endif ;; ②初期値設定 logstamp = '2012010101' str2int intlogstamp logstamp ;; ③無限ループ開始 while 1 ;; ④現在の時刻を取得し文字列を整数値に変換 getdate nowdate '%Y%m%d%H' str2int intlogdate nowdate ;; ⑤ログを取得し始めた時刻と現在時刻を比較し ;; 時刻が変わっていればログファイル名を設定 if intlogstamp != intlogdate then strLOG_FILE = LOGSPATH getdate strLOG_NAME '&h_%Y%m%d_%H%M%S.log' strconcat strLOG_FILE strLOG_NAME ;; ⑥一応ログ取得状態を確認 ;; ログ取得中であれば一旦ログをクローズ loginfo temp if result != -1 then logclose endif ;; ⑦新しいログファイル名でログ取得開始 logopen strLOG_FILE 0 0 ;; ⑧現在の時刻を変数[logstamp]にセット getdate logtime '%Y%m%d%H' str2int intlogstamp logtime endif ;; ⑨所定時間待機(1分・・・60 10分・・・600) pause 60 endwhile
マクロ内容の解説
今回は①SSH接続部分の説明は割愛させていただきます。
下記サイトでご確認ください。
Tera Termマクロサンプル-SSH自動ログイン(接続情報固定版)
②初期値を変数[logstamp]に設定
「str2int」コマンドで文字列を整数値に変換しています。
ここではとりあえず 2012年1月1日1時を設定しています。
③無限ループを使用し、強制終了をかけない限り繰り返し処理を実行。
④現在の時刻を取得し、文字列から整数値に変換。
⑤取得開始した時刻と現在の時刻を比較し、時刻が進んでいれば
ログファイル名を変数[strLOG_FILE]に設定。(1時→2時とか)
⑥「loginfo」コマンドで念のためログ取得状態を確認し、ログ取得中であれば一旦ログ取得を停止。
⑦新しいログファイル名でログを取得開始します。
⑧比較対象の時刻を変数[logstamp]にセットします。
⑨一定時間毎に時刻の変化をチェックするため、所定時間待機します。
おわりに
またTera Termで取得したログの最大サイズを確認してみました。
OS(Windows)の仕様にもよると思いますのでご参考まで。
Windows7(32bit) 4194304KB
WindowsXP(32bit)4194304KB
最大4GBまでログのサイズが増加していましたが
このサイズになるとテキストエディタでは絶対に開けませんよね。(笑)
ほどほどのサイズでログローテーションが必要ですね。
この記事を読んで、ログをローテートする機能を実装してみました。
“logrotate”というマクロコマンドで、ローテートするサイズを指定できるようにしています。
http://ttssh2.sourceforge.jp/snapshot/snapshot-20130323.zip
記事にあるような日付でローテートするものを作るかは検討中です。
あと、マクロを使わずに、設定ダイアログ等からローテート設定できるようにするかは、今後の課題です。