javascript - tag - js tab title




Как регистрировать ошибки JS от клиента в кибане? (3)

У меня есть веб-приложение, поддерживаемое в NodeJS и logstash/elasticsearch/kibana для обработки системных журналов, таких как (access_error.log, messages.log etc) . (access_error.log, messages.log etc) .

Сейчас мне нужно записать все ошибки на стороне клиента JavaScript в kibana. Каков наилучший способ сделать это?

РЕДАКТИРОВАТЬ: я должен добавить дополнительную информацию к этому вопросу. Как @Jackie Xu обеспечит частичное решение моей проблемы и как следует из моего комментария:

Меня больше всего интересует реализация обработки ошибок на стороне сервера. Я думаю, что неэффективно записывать каждую ошибку в файл. Я ищу лучшие практики, как сделать его более эффективным.

Мне нужно обрабатывать js-сообщения об ошибках на стороне сервера более эффективно, чем просто записывать в файл. Можете ли вы представить несколько сценариев, как я могу повысить производительность ведения журнала на стороне сервера?


Ведение журнала ошибок с помощью встроенной регистрации файлов по умолчанию позволяет сохранить ваши ошибки, а также позволяет вашему ядру оптимизировать записи для вас.

Если вы действительно думаете, что это недостаточно быстро (вы получаете столько ошибок?), Вы можете просто поместить их в redis.

Logstash имеет вход redis pub / sub, так что вы можете хранить ошибки в redis, а logstash извлечет их и сохранит в вашем случае вasticsearch.

Я предполагаю, что logstash / es находятся на другом сервере, в противном случае на самом деле нет никакого смысла делать это, они также должны хранить данные на диске, и это не так эффективно, как запись файла журнала.

Какое бы решение вы ни использовали, вы захотите сохранить данные, например. записываю это на диск. Добавление только к одному (журналу) файлу очень эффективно, и при сохранении данных единственный способ, которым вы можете обработать больше, - это разделить его на несколько дисков / узлов.


Если я правильно понимаю, проблема в том, что вы не отправляете свои журналы обратно на сервер (или если это было @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, вам следует взглянуть на все альтернативные входы для ввода базовых файлов. Например, я сам использовал трубу с процессом сбора журналов и вывода их на стандартный вывод. Существует также возможность читать на открытом сокете TCP, и многое другое, вы можете даже добавить свой собственный.


Сначала вам нужно будет перехватить все ошибки на стороне клиента (и отправить их на ваш сервер):

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 для визуализации.

Обратите внимание, что в соответствии с Mozilla window.onerror не работает для каждой ошибки. Возможно, вы захотите переключиться на что-то вроде Sentry (если вы не хотите платить, вы можете напрямую получить источник от GitHub ).







kibana