0

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 を介して大きなメッセージを正常にログに記録するにはどうすればよいですか?

4

2 に答える 2

1

これは、syslog プロトコル自体の基本的な制限です。1 つのメッセージが 1 つの UDP パケットに収まる必要があります。はい、EMSGSIZE は、MTU を超えていることを意味します (データ + プロトコルのオーバーヘッド)。Bunyan は、syslog サーバーと syslog をやり取りする必要があるため、実際にはこれを補うことができません。

リモート syslog サーバーが tcp を受け入れるように構成できる場合、1 つのオプションはtcp に切り替えることです。

于 2015-05-22T18:17:54.640 に答える
-1

var bunyan = require('bunyan'); var bsyslog = require('bunyan-syslog');

var log = bunyan.createLogger({ 名前: 'foo', ストリーム: [ { レベル: 'debug', タイプ: 'raw', ストリーム: bsyslog.createBunyanStream({ タイプ: 'sys', ファシリティ: bsyslog.local0, ホスト: '192.168.0.1'、ポート: 514 }) }] });

log.debug({foo: 'bar'}, 'hello %s', 'world');

それだけです。syslog ストリームを作成し、それを syslog サーバーに向けます (デフォルトでは UDP。コンストラクターで type: tcp を設定することで TCP を強制できます)。デフォルトでは、ファシリティ ユーザーと 127.0.0.1:514 の syslog サーバーを使用します。最上位ストリーム オブジェクトの bunyan に type: 'raw' を渡さなければならないことに注意してください。そうしないと機能しません。

ログを通常の bunyan 形式にしたい場合は、rsyslog を使用してテンプレートをセットアップし、JSON オブジェクトとしてフォーマットすることができます。

template(name="bunyan" type="string" string="%msg:R,ERE,1,FIELD:(\{.*\})--end%\n")

local0.* /var/log/application.log;bunyan

古い $template 構文を使用してこれを記述することもできます。

$template bunyan,"%msg:R,ERE,1,FIELD:({.*})--end%\n"

local0.* /var/log/application.log;bunyan

于 2019-01-08T10:45:07.013 に答える