Tera Term マクロでログ保存を行う
Tera Term マクロを使用してネットワーク機器のコマンドログを取得することが良くあります。このためマクロの中にログを保存する処理を含めることは必須となります。
ここでは Tera Term マクロにおけるログ保存処理の作成方法を説明します。
動作確認環境
- Tera Term Version 4.104
Tera Term マクロでのログ保存処理の流れ
Tera Term マクロでログ保存を行う場合、以下のような流れで処理を記述します。
- 現在のログ保存状況のチェック
- ログ保存の開始
- ログ保存の終了
それぞれ説明していきます。
①現在のログ保存状況のチェック
Tera Term マクロでログ保存を行う場合、ログ保存の開始処理を行う前に現在のログ保存状況のチェックを行うことを当サイトでは推奨します。
というのも、Tera Term の設定にて「自動的にログ採取を開始する」設定が有効になっている場合、マクロで機器にログインした際にこの設定に基づいて自動的にログ保存が開始され、マクロで記述したログ保存開始処理が想定通りに動作しないためです。

このため、ログイン後にまずログ保存状況のチェックを行い、ログ保存が開始されている場合にはログ保存を終了する処理を行います。
ログ保存状況のチェックは loginfo コマンドで行います。
- loginfo <変数名>
- <変数名>:ログ保存が開始されている場合ログファイル名がこの変数に格納される
- 実行結果としてシステム変数 result にログ保存状況によって値が格納される
- ログを取得していない場合は result に -1 が格納される
上記の仕様から、loginfo 実行後に変数 result の値が -1 以外の場合はログ保存を開始しているといえます。よって、result が -1 でない場合はログ保存を終了する logclose を実行します。
この処理はどのマクロでも共通で以下のように記述できます。
loginfo logfilename
if result <> -1 logclose
②ログ保存の開始処理の記述
ログ保存の開始は logopen コマンドで行います。
- logopen <ログファイルパス> <binary flag> <append flag>
- <ログファイルパス>:保存先ログファイルのパス
- パスに「\」が含まれない場合、カレントディレクトリ(デフォルトはTera Term で設定されている「標準のログ保存先フォルダ」)に保存される
- <binary flag>:0 または 1 を指定
- 0 ⇒ 受信した漢字、改行文字は変換されてファイルに書き込まれ、エスケープシーケンスは書き込まれない
- 1 ⇒ 受信した文字をすべてそのままファイルに書き込む
- 基本的には 0 を指定する
- <append flag>:0 または 1 を指定
- 0 ⇒ 指定したログファイルが存在する場合、上書きする
- 1 ⇒ 指定したログファイルが存在する場合、追記する
- 0 にすることが多いが、状況に合わせて判断すること
- <ログファイルパス>:保存先ログファイルのパス
カレントディレクトリに「logfile.log」という名前でログ保存する場合、以下のように記述します。
logopen "logfile.log" 0 0
ログ保存先については、カレントディレクトリにすることはほぼありません。マクロファイルの格納フォルダからの相対パスで指定することがほとんどです。このときマクロファイルの保存フォルダパスを取得するためのコマンドが getdir です。
- getdir <変数名>
- <変数名>:取得されたパスが格納される変数
- 取得されたパスの末尾に「\」は含まれない
マクロファイルと同じフォルダ内にに「logfile.log」という名前でログ保存する場合、以下のように getdir でマクロファイル格納フォルダパスを取得した上で strconcat でファイル名を連結します。
getdir logfilepath
strconcat logfilepath "\logfile.log"
logopen logfilepath 0 0
③ログ保存の終了
必要なログが保存できてログ保存を終了したいタイミングでログ保存の終了処理を記述します。ログ保存の終了は logclose で行います。
- logclose
- 引数は無く、単に「logclose」と記述します
logclose
【マクロ例】ログインからログアウトまでのログを保存するマクロ
ネットワーク機器のコマンドログを取得するマクロの処理の流れは大体以下のような流れになります。
- ログイン処理
- ログ保存状況チェック
- ログ保存開始
- コマンド実行
- ログ保存終了
- ログアウト
;①SSHログイン
connect "10.1.1.1:22 /ssh /2 /auth=password /user=admin /passwd=admin /nosecuritywarning"
;②ログ保存が開始されている場合logcloseする
loginfo logfilename
if result <> -1 logclose
;③ログ保存を開始
getdir logfilepath
strconcat logfilepath "\logfile.log"
logopen logfilepath 0 0
;④コマンド実行
;コマンド実行処理をここに記述
;⑤ログ保存終了
logclose
;⑥ログアウト
sendln "exit"
ログファイル名に日付や時刻を含める方法
ログファイル名に日付や時刻を含めることは良くあります。現在の日付・時刻を取得するためには gettime コマンドを使用します。
- gettime <変数名> <書式>
- <変数名>:取得した日付・時刻を使用して作成した文字列を格納する変数
- <書式>:取得した日付・時刻情報を含む文字列
- 日付・時刻情報は以下の形式で記述する
- %Y:年
- %m:月
- %d:日
- %H:時
- %M:分
- %S:秒
- 日付・時刻情報は以下の形式で記述する
例えばログファイル名の末尾に付与する情報として「_YYYYmmdd-HHMMSS.log」という文字列を作りたい場合は以下のようなマクロになります。
gettime timestr "_%Y%m%d-%H%M%S.log"
このマクロによって以下のような文字列を作成できます。
_20250325-202324.log
マクロファイル格納フォルダを取得する getdir コマンドと組み合わせてログファイルパスを作成するマクロ例は以下のようになります。
getdir logfilepath
gettime timestr "_%Y%m%d-%H%M%S.log"
sprintf2 logfilepath "%s\logfile%s" logfilepath timestr
この文字列を使用してログ保存を行った場合、マクロファイルと同フォルダに以下のような名前でログファイルが保存されます。
logfile_20250325-202641.log
マクロ2重実行によるログファイルの上書きに注意
コマンドログを取得するマクロで保存されるログファイル名が固定の設定になっている場合、ログファイルの上書きに注意する必要があります。ログファイル名が固定の場合、マクロを2回実行すると1度目に取得したログが上書きされてしまいます。(logopen の append flag が 0 の場合)
この事故を防止するための方法として、前項に記載のログファイル名に現在時刻(秒まで)を含めるという方法が当サイトの推奨です。
まとめ
- マクロでのログ保存処理の流れは①ログ保存状況のチェック、②ログ保存の開始、③ログ保存の終了
- ログファイルパスの作成のために getdir や gettime を使用する
- マクロの2重実行によるログファイルの上書きに注意しよう
- 基礎知識
- コマンド解説
- ログイン
- コマンド実行
- ログ保存
- ファイル・フォルダ操作
- 文字列操作
- 変数関連
- マクロのモジュール化
- テクニック
- サブルーチン
- オリジナルマクロ
コメント