0

我正在使用 node express 来处理heroku 日志数据的 POST 请求,其正文数据application/logplex-1格式为(显然是syslog formatted)。

特别是,我使用body-parser 模块作为中间件来解析 POST 正文。

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

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

有任何想法吗?

4

1 回答 1

3

我没有使用 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);
});

它用于glossy将系统日志消息解析为 Javascript 对象。

如果要发布的数据量相当大(> 数百 K),那么实现流式解决方案可能会更好,因为上面的代码将首先将整个消息体读入内存。

于 2015-08-20T11:49:23.483 回答