首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用节点-bunyan-syslog记录大型消息

用节点-bunyan-syslog记录大型消息
EN

Stack Overflow用户
提问于 2015-05-22 17:25:19
回答 2查看 2.4K关注 0票数 0

我正在使用节点-bunyan-syslog为我的节点应用程序的Bunyan记录器提供syslog流,它似乎是用于节点应用程序中的syslog日志记录的一个常用库。下面是我的基本记录器实现:

代码语言:javascript
复制
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
        }
    ]
}); 

通常,这个日志语句:

代码语言:javascript
复制
logger.debug('Processing message: ' + JSON.stringify(data));

引发以下错误:

代码语言:javascript
复制
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 )时,会抛出EMSGSIZE错误。

我的第一个想法是,传递到log语句中的data太大了(实际上,如果我只记录小消息,错误就会停止抛出),因为它有时可能有多个KB大小。但是,日志消息的大小不应该与我实例化的节点-bunyan-syslog流传输的数据包大小无关吗?

我查看了节点-bunyan-syslog源代码,试图确定它是否将自己的消息分解为数据包,但我无法找到任何这样的逻辑。

一种解决方案是首先检查建议的日志消息的大小,如果小于一定的大小,则只检查日志大小,但这似乎没有必要的限制。我希望node syslog或它的基础套接字库能够处理基本的协议限制,比如MTU,而不会将相关的错误传播给用户。

我对病因的评估准确吗?此上下文中的EMSGSIZE错误是否是由于超出MTU而导致的?如何通过Bunyan和节点-bunyan-syslog成功地记录大型消息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-22 18:17:54

这是syslog协议本身中的一个基本限制。单个消息必须能够容纳到单个UDP数据包中。是的,EMSGSIZE意味着您超过了MTU (具有数据+协议开销)。Bunyan不能真正弥补这一点,因为它必须对syslog服务器说syslog。

如果您的远程syslog服务器可以配置为接受它,则可以选择切换到tcp

票数 1
EN

Stack Overflow用户

发布于 2019-01-08 10:45:07

var bunyan =需要量(‘bunyan’);var bsyslog =需要量(‘bunyan-syslog’);

var log = bunyan.createLogger({ name:'foo',streams:{ level:‘调试’,类型:'raw',流: bsyslog.createBunyanStream({ type:'sys',bsyslog.local0,host:'192.168.0.1',端口: 514 } });

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

差不多就是这样。您创建一个syslog流,并将其指向syslog服务器(默认情况下,可以通过在构造函数中设置类型: TCP来强制tcp );默认情况是在127.0.0.1:514上使用设施用户和syslog服务器。注意,您必须在顶级流对象中将“raw”类型传递给bunyan,否则这将无法工作。

如果希望日志采用正常的bunyan格式,rsyslog允许您设置一个模板,将其格式化为JSON对象:

模板(name=“bunyan”type=“字符串”string="%msg:R,ERE,1,FIELD:({.*})--end%\n")

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

您还可以使用旧的$template语法编写此代码:

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

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30402564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档