Отправлять журналы NGINX в Graylog
Я пытаюсь собрать ошибки nginx и получить доступ к журналам с помощью graylog, я думаю, что все настроено правильно, но Graylog ничего не получает от NGINX (Graylog и NGINX находятся в док-контейнерах, и оба находятся в одной сети)
Я использую nginx/1.13.5 и Graylog 2.4.0, и я использую этот пакет контента на graylog
Вот мой nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
log_format graylog2_json escape=json '{ "timestamp": "$time_iso8601", '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": $body_bytes_sent, '
'"request_time": $request_time, '
'"status": $status, '
'"request": "$request", '
'"request_method": "$request_method", '
'"host": "$host",'
'"upstream_cache_status": "$upstream_cache_status",'
'"upstream_addr": "$upstream_addr",'
'"http_x_forwarded_for": "$http_x_forwarded_for",'
'"http_referrer": "$http_referer", '
'"http_user_agent": "$http_user_agent" }';
access_log syslog:server=graylog:12301,facility=local0,tag=nginx,severity=info graylog2_json;
error_log syslog:server=graylog:12302,facility=local0,tag=nginx,severity=error warn;
#error_log stderr;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
daemon off;
Если я пытаюсь с nc, мой серый журнал получает сообщение
echo -n "test message" | nc -u -w1 graylog 12301
Спасибо!
1 ответ
Я предлагаю вам собрать некоторую отладочную информацию: как вы сказали, ваша сеть работает
- TCP Dump пакеты на хосте Graylog:
если Nginx на том же хосте, что и Graylog: sudo tcpdump udp -n -vv port 12301 -i lo -X
если Nginx на другом хосте, как Graylog: sudo tcpdump udp -n -vv port 12301 -X
Если сетевой уровень работает, и вы можете видеть пакеты, как на картинке, перейдите к Graylog Inputs и проверьте, какой тип входа у вас есть.
[a] Это должен быть Raw / Plaintext UDP (если у вас GELF UDP, Graylog будет фильтровать ваши сообщения, так как Nginx отправляет журналы в формате Syslog, а не в Json).
[b] У вас будет сетевой ввод / вывод, отличный от 0
[c] Порт (12301 в вашем случае) и IP должны быть такими же, как в конфигурации Nginx
- Если у вас есть все это, вы найдете RAW-сообщение от Nginx в своем Graylog:
<190> Jul.26.16: 12: 07.graylog.nginx:. { "Отметка времени":.."2018-07-26T16:12:07+03:00", "remote_addr":.. "Xx.xxxxx"., "body_bytes_sent":..4277, "request_time":.0,005, "response_status":..200, "запрос":.."POST./api/cluster/metrics/multiple.HTTP/1.1",." REQUEST_METHOD ":."POST". "хозяин":. "xx.xxxxx",."upstream_cache_status":."-",."upstream_addr":."xx.xxxxx",. "HTTP_X_FORWARDED_FOR":." хх.xxxxx ",." http_referrer ":." https://xx.x.x.xxx/system/inputs ",." http_user_agent ":." xx.xxxxxxx.xxxxxxx.xxxxxxx.xxxxx",."http_version":."HTTP/1.1",."nginx_access":.true.}
- Извлеките псевдо-Syslog RAW сообщение в формате JSON, используя Graylog Input Extractor:
Пример экстрактора:
{
"extractors": [
{
"title": "Extract from Pseudo-Syslog a JSON",
"extractor_type": "regex_replace",
"converters": [],
"order": 0,
"cursor_strategy": "cut",
"source_field": "message",
"target_field": "message",
"extractor_config": {
"replacement": "$1",
"regex": "^.*?(\\{.*?\\})$"
},
"condition_type": "none",
"condition_value": ""
}
],
"version": "2.4.6"
}
Поскольку вы используете "пакет содержимого", вам нужно добавить правило перед всеми остальными, пришедшими из "пакета содержимого" (порядок: 0), если вы выполняете импорт-экспорт.
После добавления правила у вас будет чистый лог JSON от Nginx, вся остальная работа будет выполняться "пакетом контента"
- Проверьте вашу конфигурацию Nginx
Пример ngnix.conf:
log_format graylog_json '{ "timestamp": "$time_iso8601", "remote_addr": "$remote_addr", "body_bytes_sent": $body_bytes_sent, "request_time": $request_time, "response_status": $status, "request": "$request", "request_method ": "$request_method", "host": "$host", "upstream_cache_status": "$upstream_cache_status", "upstream_addr": "$upstream_addr", "http_x_forwarded_for": "$http_x_forwarded_for", "http_referrer": "$http_referer", "http_user_agent": "$h ttp_user_agent", "http_version": "$server_protocol", "nginx_access": true }';
access_log syslog:server=graylog:5555 graylog_json;
Надеюсь, после всех этих шагов вы найдете полезными