私はnginxエラーを収集し、graylogでログにアクセスしようとしています、すべてが正しく構成されていると思いますが、GraylogはNGINXから何も受信しません(GraylogとNGINXはDockerコンテナーにあり、両方が同じネットワークにあります)
私はnginx/1.13.5とGraylog 2.4.0を使用していますが、グレイログで このコンテンツパック を使用しています
これが私の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入力に移動して、どの種類の入力があるかを確認します
[a]Raw/Plaintext UDPである必要があります(GELF UDPがある場合GraylogはメッセージをフィルタリングしますasNginxはJsonではなくSyslog形式でログを送信します
[b]Network IO 0とは異なる)
[c]Port(あなたの場合12301)と[〜#〜] ip [〜#〜]はNginx構成と同じである必要があります
<190> Jul.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.xxxxx/system/inputs "、。 "http_user_agent":。 "xx.xxxxxxx.xxxxxxx .xxxxxxx.xxxxx "、。" 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)からの他のすべてのルールの前にルールを追加する必要があります。
ルールを追加すると、NginxからのJSONログがクリアされ、他のすべての作業は「コンテンツパック」を実行します
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;
このすべての手順を実行すると、役立つと思います