Node-REDのLogをファイルに落としたい

1.目的

Node-REDの動作が異常になった際の原因確認などのために、Node-REDのLogを確認したくなります。PDHやPDHと同様にNode-REDをinstall scriptを使用してサービスとして実行している場合には、node-red-logコマンドで端末にlogを表示することができます。しかし、node-red-logコマンドは直近のLogしか表示してくれないので、動作異常の原因を探る場合には、もう少し前のLogの情報が欲しくなります。

そこで、Logをファイルに落とす方法を2つ紹介します。
1つ目は、UNIXのコマンドを使って、node-red-logコマンドの内容をリダイレクトする方法です。この方法のメリットは、今走っているNode-REDを止めなくてよいことです。デメリットは、Node-REDを再起動させた場合には、忘れずに同じ内容を実行しないといけないことです。
もう1つは、Node-REDのsettings.jsファイルを修正して、Logファイルを作成する方法です。こちらの方法のメリットとデメリットは1つ目の方法の裏返しで、Node-REDをリスタートさせる必要があることがデメリットでメリットは自動でログがファイルに落とされることです。

参考HP:
1)Node-REDでできること part2 (応用編)
2)【Node.js】TypeError [ERR_INVALID_CALLBACK]: Callback must be a function」の対処法

2.node-red-logのリダイレクトによるLogのファイル保存

Node-REDが走っているPDH(マシン)で新しい端末を開きます。

$ node-red-log > temp.log &

を実行します(ファイル名は、パスを含めて変更してください)。これで、バックグラウンドでlogが’temp.log’ファイルに保存されます。実行した際の返り値の数字は、PIDです。バックグラウンドで走っている識別番号です。忘れてしまっても大丈夫です。端末で確認できます。

$ ps

と入力すると、今バックグラウンドで走っているプログラムのリストが出ます。

下の例でCMDが‘node-red-log’となっているのが、上で実行したプログラムで、そのPIDが
1718で上の返り値と一致しています。

$ ls –l

を使って、時間の経過とともにファイルサイズが増えていっているのを確認しています。

バックグラウンドの処理を止める場合には、

$ kill (PID)

と入力して止めます。

下の例では、止めた後に消えたかを確認するために、再度$psを実行しています。
すると、該当のPIDがリストからなくなっているのが確認できます。

さらに、’node-red-log > temp.log’が止められた(Terminated)と表示されました。

2. jsファイルの修正によるLogのファイル保存

Node-REDの設定ファイルであるsettings.jsが、ホームディレクトリの下の’.node-red’の下にあります (PDHの場合は、/home/pi/.node-red/settings.js) 。
まず、現行のsettings.jsをコピーしてバックアップします。

$ cp settings.js settings.js.org

次に、エディタでsettings.jsを開いて以下の2か所の修正を行います。

1)ファイル先頭に書込むファイルの情報を追加
以下の記述をファイルの先頭に追加します。
‘/home/pi/test.log’の部分は、記録するパスとファイル名です。
各自の環境に合わせて変更してください。

// ログファイルのパスを入れる
var fs = require("fs");
fs.writeFile('/home/pi/test.log','',function(err, result) {
    if(err) console.log('error', err);
}); // 初期化

2) logging:{}の中のconsole:{}の後に file:{}を追加

サーチでloggingを検索します。もしくはスクロールして探してください。
logging:{}の中にあるconsole:{}の次にfile:{}を追加します。
a) console:{}の終わりの中括弧の後に、設定が継続することを明示するためにカンマを追加します。
b) 以下の記述を追加します。
‘/home/pi/test.log’の部分は、記録するパスとファイル名です。ファイル先頭に記載したパスとファイル名と同じにしてください。

file:{
    level: 'info',
    metrics: false,
    audit: false,
    handler : function(settings){
        return function (msg){
            fs.appendFile('/home/pi/test.log',
                          (new Date(msg.timestamp)).toISOString() + " : " + JSON.stringify(msg) + '\n',
                          function(err, result) {
                              if(err) console.log('error', err);
                          });
        }
    }
}

logのlevelですが、上記では、console出力もfile出力も“info”にしていますが、例えば、fileの level:”debug” にするとファイル出力だけ、より詳しいlogが出ます。ただし、ファイルサイズが大きくなるので要注意です。