我在NodeJS和logstash/elasticsearch/kibana
中有web应用程序支持端来处理像(access_error.log, messages.log etc)
一样的系统日志。
现在,我还需要将所有JavaScript客户端错误记录到kibana中。做这件事最好的方法是什么?
编辑:我必须向这个问题添加更多信息。@Jackie Xu为我的问题提供了部分解决方案,并在我的评论中如下所示:
我最感兴趣的是实现服务器端错误处理。我认为将每个错误写入文件是无效的。我正在寻找如何使其更具性能的最佳实践。
我需要在服务器端更有效地处理js错误记录,而不仅仅是写入文件。您能提供一些场景吗?如何提高服务器端日志记录性能?
发布于 2014-07-06 23:25:29
当你说客户端时,我在这里假设你指的是日志客户端,而不是web客户端。
首先,养成以通用格式记录错误的习惯。Logstash喜欢一致性,所以如果将文本和JSON放在同一个输出日志中,就会遇到问题。提示:登录JSON。它非常棒,而且非常灵活。
整个过程如下所示:
<代码>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查看日志。
发布于 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套接字上进行读取,甚至可以添加自己的套接字。
发布于 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获得源代码)。
https://stackoverflow.com/questions/24502190
复制相似问题