Nginx Ingress Log Shipping
Kubernetes is gaining popularity every day. Using an Ingress controller is the preferred method of allowing external access to the services in a cluster. This makes Ingress logs incredibly important for tracking the performance of your services, issues, bugs, and the security of your cluster.
Ship Ingress logs¶
Note: Make sure that the following prerequisites are met before continuing:
Enable JSON logging, by updating the Ingress config section:
defaultBackend:
replicaCount: 2
controller:
kind: DaemonSet
extraEnvs:
- name: LOGS_TOKEN
value: "<YOUR_LOGS_TOKEN>"
config:
use-forwarded-headers: "true"
use-geoip: "false"
use-geoip2: "false"
log-format-escape-json: "true"
log-format-upstream: '{
"@timestamp": "$time_iso8601",
"remote_addr": "$remote_addr",
"x-forward-for": "$proxy_add_x_forwarded_for",
"request_id": "$req_id",
"remote_user": "$remote_user",
"bytes_sent": $bytes_sent,
"request_time": $request_time,
"status": $status,
"vhost": "$host",
"request_proto": "$server_protocol",
"path": "$uri",
"request_query": "$args",
"request_length": $request_length,
"duration": $request_time,
"method": "$request_method",
"http_referrer": "$http_referer",
"http_user_agent": "$http_user_agent"
}'
To limit log collection to the default
and ingress
namespaces, use the MATCH_BY_NAME
option.
Create an agent.yaml
file that looks like this:
region: US
logsToken: "<YOUR_LOGS_TOKEN>"
logagent:
config:
MATCH_BY_NAME: .*_(default|ingress)_.*
Setup Logagent to parse and ship logs:
helm install --name agent stable/sematext-agent -f agent.yaml
Remove log enrichment¶
Some of the larger fields like container
, labels
and logSource
are added by Logagent for better context. These can be removed by using the REMOVE_FIELDS
option in Logagent:
Add the REMOVE_FIELDS
option to your agent.yaml
:
region: US
logsToken: "<YOUR_LOGS_TOKEN>"
logagent:
config:
MATCH_BY_NAME: .*_(default|ingress)_.*
REMOVE_FIELDS: container,labels,logSource
Run the Helm upgrade command:
helm upgrade agent stable/sematext-agent -f agent.yaml
Remove unneeded fields¶
The same thing can be done by removing the unneeded fields from the Nginx Ingress log format.
log-format-upstream: '{
"@timestamp": "$time_iso8601",
"remote_addr": "$remote_addr",
"bytes_sent": $bytes_sent,
"request_time": $request_time,
"status": $status,
"vhost": "$host",
"request_proto": "$server_protocol",
"path": "$uri",
"request_query": "$args",
"request_length": $request_length,
"duration": $request_time,
"method": "$request_method",
"http_user_agent": "$http_user_agent"
}'
Remove unneeded logs¶
To reduce logs size even further, some of the logs can be dropped. For example the 2xx requests can filtered by using the IGNORE_LOGS_PATTERN
option in Logagent:
Add the IGNORE_LOGS_PATTERN
option to your agent.yaml
:
region: US
logsToken: "<YOUR_LOGS_TOKEN>"
logagent:
config:
MATCH_BY_NAME: .*_(default|ingress)_.*
REMOVE_FIELDS: container,labels,logSource
IGNORE_LOGS_PATTERN: \"status\":\s20
Run the Helm upgrade once again:
helm upgrade agent stable/sematext-agent -f agent.yaml
By using MATCH_BY_NAME
you can limit log collection to desired namespaces. Unneeded fields can be removed using REMOVE_FIELDS
in the configuration. Even entire log lines can be ignored with IGNORE_LOGS_PATTERN
. Logagent makes it easy to slim down any logs with very little effort.