Я пытаюсь собрать журнал ошибок 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
Спасибо!
Я предлагаю вам собрать некоторую отладочную информацию: как вы сказали, ваша сеть работает
если 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
<190> 26 июля.16: 12: 07.graylog.nginx:. {. "Timestamp":. "2018-07-26T16: 12: 07 + 03: 00",. "Remote_addr":. "Xx.xxxxx ",." body_bytes_sent ":. 4277,." request_time ":. 0.005,." response_status ":. 200,." request ":." POST./api/cluster/metrics/multiple.HTTP/1.1 ",. "request_method":. "POST",. "host":. "xx.xxxxx",. "upstream_cache_status":. "-",. "upstream_addr":. "xx.xxxxx",. "http_x_forwarded_for": . "xx.xxxxx",. "http_referrer" :. "https://xx.x.x.xxx/system/inputs",." http_user_agent ":." xx.x.x.xxxxx.x.x.xxxxx.x.x.xxxxx.x.x.xxx ",." http_version ":." HTTP / 1.1 ",." nginx_access ":. true.}
Пример экстрактора:
{
"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, все остальное будет делать «пакет контента»
Пример 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;
Надеюсь, следуя всем этим шагам, вы найдете полезными