node express body-parser for application / logplex-1

时间:2015-08-20 11:14:24

标签: node.js parsing heroku express body-parser

我正在使用node express来处理heroku logging data的POST请求,其中包含application/logplex-1格式的身体数据(显然是syslog formatted)。

特别是,我使用body-parser module作为中间件来解析POST主体。

可以指定app.use(bodyParser.text({ type: 'application/logplex-1' }))来强制body-parser将正文解析为文本,但文本只是一大块空格分隔的信息,除此之外没有太多结构。因此,我需要进一步解析身体数据,以找到并提取我想要的内容。

这没关系,但我想知道是否有更好的方法可以更直接地将logplex-1主体解析为更结构化,更易于使用的内容,例如JSON。我不熟悉logplex-1或syslog格式,以及它是否确实有更多有用的结构/元数据,而不是我目前得到的文本块。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

我没有使用logplex或Heroku的经验,但这似乎有效:

var syslogParser = require('glossy').Parse;
var express      = require('express');
var app          = express();
var server       = app.listen(3012);

// Express allows arrays-of-middleware to act as a "single" middleware.
var logplexMiddleware = [
  // First, read the message body into `req.body`, making sure it only
  // accepts logplex "documents".
  require('body-parser').text({ type: 'application/logplex-1' }),
  // Next, split `req.body` into separate lines and parse each one using
  // the `glossy` syslog parser.
  function(req, res, next) {
    req.body = (req.body || '').split(/\r*\n/).filter(function(line) {
      // Make sure we only parse lines that aren't empty.
      return line.length !== 0;
    }).map(function(line) {
      // glossy doesn't like octet counts to be prepended to the log lines,
      // so remove those.
      return syslogParser.parse(line.replace(/^\d+\s+/, ''));
    });
    next();
  }
];

// Example endpoint:
app.post('/', logplexMiddleware, function(req, res) {
  console.log(req.body);
  return res.sendStatus(200);
});

它使用row将syslog消息解析为Javascript对象。

如果发布的数据量相当可观(大约数百K),则实施流式解决方案可能会更好,因为上面的代码会首先将整个邮件正文读入内存。