0

我正在对客户端安装我们的 BlackBoard 插件的问题进行故障排除。根据我们的要求,我们获得了一些 json 格式的日志文件。这些很难阅读。

我尝试在 IDE 中打开,比如 VS Code,但它们对于应用程序来说太大了。我还下载了 Apache Log Viewer,因为我注意到日志中有一些对 Tomcat 的引用。查看器似乎能够解析文件,但是打开文件需要我选择一种格式,而我对如何确定日志文件格式还不够了解。

这是日志文件中的示例行:

{"tags":["plugin
s"],"path":"/usr/local/blackboard/logs/plugins/bbgs-mbs/application.log","host":"ip-xx-xxx-xxx-xxx","message":"2019-10-07 05:02:16 | ERROR | 234:org.hibernate.util.JDBCExceptionReporter  | ERROR: relation \"bbgs_mbs_alerts\" does not exist","type":"plugins","@version":"1","@timestamp":"2019-10-07T09:02:16.715Z","clientid":"xxxxxxxxxxxxx"}

理想情况下,我所追求的只是一种简单的方法来加载我拥有的 4 个文件,按日期排序,并尝试找到与客户端报告的错误的相关性。

帮帮我,你是我唯一的希望

4

1 回答 1

0

我使用节点脚本调整了日志文件。具体来说,我对文件进行了一些字符串替换,将其解析为 JSON,然后将其写回一个新文件。

我还使用 jsonpath npm 包将我需要的属性写入 txt 文件。

如果其他人可能会发现它有帮助,这是完整的解决方案(我知道它很丑,但只是在一次可行的事情之后:/)

// Make sure we got a filename on the command line.
if (process.argv.length < 3) {
  console.log('Usage: node ' + process.argv[1] + ' FILENAME');
  process.exit(1);
}

// Read the file and print its contents.
var  fs = require('fs')
  , jp = require('jsonpath')
  , filename = process.argv[2]
  , property = process.argv[3]
  , debug_mode = process.argv[4]
  , only_messages = process.argv[5];

fs.readFile(filename, 'utf8', (err, data) => {
    if (err) throw err;
    const _newNameArr = filename.split('/');
    const _filename = _newNameArr[_newNameArr.length - 1];
    const replaced = data.replace(/[\n\r]/g, '');
    const replacedAgain = replaced.replace(/\}[\s]*\{/g, '},{');
    const _destFileName = (only_messages == 'true')
      ? `messages_${_filename}`
      : `${property || 'full'}_${_filename.replace('.txt', '.json')}`;

    if (debug_mode == 'true') {
      fs.writeFile('DEBUG-replaced_' + _destFileName, replacedAgain, (err) => {
        if (err) throw err;
        console.log('The file has been saved!');
      });
    }
    const parsed = JSON.parse(replacedAgain);

    const _fileContent = (only_messages == 'true')
      ? jp.query(parsed, '$..message').join('\n')
      : JSON.stringify(parsed, (property ? [property] : null), 1);

    fs.writeFile(_destFileName, _fileContent, (err) => {
      if (err) throw err;
      console.log(`The file, ${_destFileName}, has been saved!`);
    });

});
于 2019-10-17T18:28:51.953 回答