node-bunyan-syslogを使用して、ノード アプリケーションの Bunyan ロガーに syslog ストリーミングを提供しています。これは、ノード アプリケーションでの syslog ロギングに一般的に使用されるライブラリのようです。私の基本的なロガーの実装は次のとおりです。
var bunyan = require('bunyan');
var syslog = require('bunyan-syslog');
var syslogStream = syslog.createBunyanStream({
host: 'my.remote.host',
port: 514,
type: 'udp'
});
module.exports = bunyan.createLogger({
name: 'alert-creator-logger',
streams: [
{
level: 'debug',
type: 'raw',
stream: syslogStream
}
]
});
時々、このログ ステートメント:
logger.debug('Processing message: ' + JSON.stringify(data));
次のエラーがスローされます。
events.js:85
throw er; // Unhandled 'error' event
^
Error: send EMSGSIZE
at exports._errnoException (util.js:746:11)
at SendWrap.afterSend [as oncomplete] (dgram.js:348:23)
私のストリームは UDP を使用するように構成されているため、UDP(7) 仕様を調べました。これは、送信されているパケットのサイズが、送信されているネットワーク インターフェイスに設定されている MTU (Maximum Transmission Unit) を超えると、EMSGSIZE エラーがスローされることを示しています。使用済み。
最初に考えたのはdata
、ログ ステートメントに渡される が大きすぎるということでした (実際、小さなメッセージのみをログに記録すると、エラーがスローされなくなります)。これは、サイズが数 KB になる場合があるためです。しかし、ログ メッセージのサイズは、インスタンス化した node-bunyan-syslog ストリームによって送信されるパケット サイズとは何の関係もありませんか?
node-bunyan-syslog のソース コードを調べて、独自のメッセージ分解をパケットに行うかどうかを判断しようとしましたが、そのようなロジックを見つけることができませんでした。
1 つの解決策は、提案されたログ メッセージのサイズを最初に確認し、特定のサイズ以下の場合にのみログに記録することですが、これは不必要に制限的であるように思われます。node-bunyan-syslog またはその基盤となるソケット ライブラリが、関連するエラーをユーザーに伝達することなく、MTU などの基本的なプロトコル制限を処理することを期待します。
私の原因の評価は正確ですか?このコンテキストでの EMSGSIZE エラーは、MTU の超過が原因ですか? Bunyan と node-bunyan-syslog を介して大きなメッセージを正常にログに記録するにはどうすればよいですか?