はじめに
こんにちは。
これは、2021年 NI+C Advent Calendar 12日目の記事です。
毎年のごとく、(Google Cloudのはずだけど)私はNode-RED絡めて書きます。
Node-RED Flowのログを出力する
Node-REDのフローからログを出力する際は、出力したいフローの箇所にDebug Nodeをつなげて出力します。GAE等でもこれは変わらずDebug Nodeの設定で「システムコンソール」にチェックを入れればCloud Loggingにちゃんと出力されるのですが、、、重要度指定なし、出力対象のオブジェクトは全てStringとして出力されてしまい、せっかくのCloud Loggingの便利さが活かせない残念な結果になってしまいます。お仕事で使うのであれば、こういったところも「運用しやすさ」を意識してやりたいですよね?でも、どうやればいいのでしょうか、、、?
Cloud Loggingにログをキレイに出力したい(前準備)
Google Cloud用にカスタムしたスターターを使いましょう。これを使うと、Cloud Loggingに合わせた出力が可能になります。もし、スターターコードは使わず進めたい場合は、以下を自分の環境に移植してください。
- utils フォルダ(中身すべて)
- settings.js
// settings.js
// 8行目
const logger = require('./utils/logger');
// 9行目
const logHelper = require('./utils/logHelper');
// 74-78行目
handler: function () {
return function (msg) {
logHelper.log(msg);
};
},
Cloud Loggingにログをキレイに出力したい(フロー実装)
以下図のようにワイヤリングしてください。
Function Nodeは以下のように記入ください
LOG_MSG(Function Node)
let logMsg = "ログタイトル(一言メッセージ)";
let logObj = {
"LOG_SEVERITY": "info", // Cloud Loggingの重要度
"LOG_MESSAGE": logMsg,
"payload": msg.payload // ログの詳細
};
msg.log = JSON.stringify(logObj); // Cloud Logging出力用 ※1
msg.payload = logObj; // Node-REDデバッグタブ出力用
return msg;
※1: Version2.0.6以降(だったかしら、、)のNode-REDからDebug出力になにか手が入ったっぽく、Debug Nodeでシステムコンソール出力する前にJSONをStringに変換しないと、フォーマットが崩れて出力されてしまいます。。ですので、msg.log = JSON.stringify(logObj)
は今は必ず行いましょう。(いつか、問題箇所見つけて修正します。。)
Cloud Loggingでログを確認
LOG NAMEは winston_log として出力されますので、winston_logで絞り込んでください。
LOG_MSG(Function Node)のコードとの対応は以下図のようになってますので、目的のログが出力されたか確認ください。
まとめ
いかがでしたか??
Cloud LoggingはGCP上の様々なログを統合し確認できる、フィルタリング操作にも優れたツールで、Cloud Monitoringと組み合わせてログ条件でのalert設定も可能です。運用面で非常に役に立つこの機能にNode-REDも少しの工夫で対応できますのでぜひご活用ください。