首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将客户端的JS错误记录到kibana中?

如何将客户端的JS错误记录到kibana中?
EN

Stack Overflow用户
提问于 2014-07-01 11:50:22
回答 4查看 30.6K关注 0票数 35

我在NodeJS和logstash/elasticsearch/kibana中有web应用程序支持端来处理像(access_error.log, messages.log etc)一样的系统日志。

现在,我还需要将所有JavaScript客户端错误记录到kibana中。做这件事最好的方法是什么?

编辑:我必须向这个问题添加更多信息。@Jackie Xu为我的问题提供了部分解决方案,并在我的评论中如下所示:

我最感兴趣的是实现服务器端错误处理。我认为将每个错误写入文件是无效的。我正在寻找如何使其更具性能的最佳实践。

我需要在服务器端更有效地处理js错误记录,而不仅仅是写入文件。您能提供一些场景吗?如何提高服务器端日志记录性能?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-07-06 23:25:29

当你说客户端时,我在这里假设你指的是日志客户端,而不是web客户端。

首先,养成以通用格式记录错误的习惯。Logstash喜欢一致性,所以如果将文本和JSON放在同一个输出日志中,就会遇到问题。提示:登录JSON。它非常棒,而且非常灵活。

整个过程如下所示:

  1. 错误发生在您的应用程序中
  2. 将错误记录到文件、套接字或网络上
  3. 告诉logstash如何获取(输入)该错误(即从文件、通过网络监听等)
  4. 告诉logstash将错误发送(输出)到Elasticsearch (可以在同一台计算机上运行)

<代码>G29

在你的应用程序中,尝试使用节点的bunyan记录器。https://github.com/trentm/node-bunyan

节点应用程序index.js

var bunyan = require('bunyan');
var log = bunyan.createLogger({
  name: 'myapp',
  streams: [{
    level: 'info',
    stream: process.stdout // log INFO and above to stdout
  }, {
    level: 'error',
    path: '/var/log/myapp-error.log' // log ERROR and above to a file
  }]
});

// Log stuff like this
log.info({status: 'started'}, 'foo bar message');

// Also, in express you can catch all errors like this
app.use(function(err, req, res, next) {
   log.error(err);
   res.send(500, 'An error occurred');
});

然后,您需要配置logstash来读取这些JSON日志文件,并将其发送到Elasticsearch/Kibana。创建一个名为myapp.conf的文件,然后尝试以下操作:

日志存储配置myapp.conf

# Input can read from many places, but here we're just reading the app error log
input {
    file {
        type => "my-app"
        path => [ "/var/log/myapp/*.log" ]
        codec => "json"
    }   
}

# Output can go many places, here we send to elasticsearch (pick one below)
output {

  elasticsearch {
    # Do this if elasticsearch is running somewhere else
    host => "your.elasticsearch.hostname"
    # Do this if elasticsearch is running on the same machine
    host => "localhost"
    # Do this if you want to run an embedded elastic search in logstash
    embedded => true   
  }

}

然后启动/重新启动logstash,如下所示:bin/logstash agent -f myapp.conf web

转到http://your-elasticsearch-host:9292上的elasticsearch查看日志。

票数 45
EN

Stack Overflow用户

发布于 2014-07-09 23:34:55

如果我没理解错的话,你遇到的问题不是把你的日志发送回服务器(或者如果是@Jackie-xu提供了一些提示),而是关于如何最有效地把它们发送到elastiscsearch。

实际上,传统堆栈Logstash/Elasticsearch/Kibana的绝大多数用户习惯于让一个应用程序登录到一个文件中,然后使用Logstash的插件读取文件,解析该文件并将结果发送到ElasticSearch。既然@methai对此做了很好的解释,我就不再往下说了。

但我想说的是:

你不会被强制使用Logstash.

实际上,Logstash的主要作用是收集日志,解析它们以识别它们的结构和递归字段,最后以JSON格式输出它们,以便将它们发送到ElasticSearch。但是由于您已经在客户端操作了javascript,所以可以很容易地想象您将直接与Elasticsearch服务器对话。例如,一旦你捕获到一个javascript异常,你可以这样做:

var xhr = new XMLHttpRequest();
xhr.open("PUT", http://your-elasticsearch-host:9292, true);
var data = {
    lineNumber: lineNumber,
    message: message,
    url: url
}
xhr.send(JSON.stringify(data));

这样做,您就可以直接从客户端与ElasticSearch服务器进行对话。我想不出一种更简单、更快的方法来做到这一点(但请注意,这只是理论上的,我从未尝试过自己,所以实际情况可能会更复杂,特别是如果您希望生成日期时间戳等特殊字段;)。在生产环境中,您可能会遇到安全问题,可能是客户机和ES服务器之间的代理服务器,但原则是存在的。

如果您绝对想使用Logstash,则不会强制使用文件输入

如果,为了协调,像每个人一样做,或者为了使用高级的logstash解析配置,你想坚持使用Logstash,你应该看看基本文件输入的所有alternative inputs。例如,我过去常常使用管道,有一个负责收集日志并将其输出到标准输出的进程。此外,还可以在打开的tcp套接字上进行读取,甚至可以添加自己的套接字。

票数 8
EN

Stack Overflow用户

发布于 2014-07-05 20:51:24

您必须首先捕获所有客户端错误(并将这些错误发送到您的服务器):

window.onerror = function (message, url, lineNumber) {

    // Send error to server for storage
    yourAjaxImplementation('http://domain.com/error-logger/', {
        lineNumber: lineNumber,
        message: message,
        url: url
    })

    // Allow default error handling, set to true to disable
    return false

}

之后,您可以使用NodeJS将这些错误消息写入日志。Logstash可以收集这些数据,然后您可以使用Kibana进行可视化。

请注意,according to Mozilla window.onerror似乎并不适用于每个错误。你可能想切换到像Sentry这样的东西(如果你不想付费,你可以直接从GitHub获得源代码)。

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

https://stackoverflow.com/questions/24502190

复制
相关文章

相似问题

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