8000 Add more control over log_format config directive · nginx-proxy/nginx-proxy@56c7a3b · GitHub
[go: up one dir, main page]

Skip to content

Commit 56c7a3b

Browse files
committed
Add more control over log_format config directive
Introduces 3 new environmental variables: - `LOG_FORMAT` - `LOG_FORMAT_ESCAPE` - `LOG_JSON` `LOG_FORMAT` and `LOG_FORMAT_ESCAPE` default to standard values. When `LOG_JSON` is set, defaults are changed to: `{"time_local":"$time_iso8601","client_ip":"$http_x_forwarded_for","remote_addr":"$remote_addr","request 10000 ":"$request","status":"$status","body_bytes_sent":"$body_bytes_sent","request_time":"$request_time","upstream_response_time":"$upstream_response_time","upstream_addr":"$upstream_addr","http_referrer":"$http_referer","http_user_agent":"$http_user_agent","request_id":"$request_id"}`and `json`. See `nginx.tmpl` and https://nginx.org/en/docs/http/ngx_http_log_module.html#log_format for details
1 parent 1f855fc commit 56c7a3b

File tree

5 files changed

+78
-1
lines changed

5 files changed

+78
-1
lines changed

nginx.tmpl

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,24 @@ map $proxy_x_forwarded_proto $proxy_x_forwarded_ssl {
277277

278278
gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
279279

280-
log_format vhost '{{ or $globals.Env.LOG_FORMAT "$host $remote_addr - $remote_user [$time_local] \"$request\" $status $body_bytes_sent \"$http_referer\" \"$http_user_agent\" \"$upstream_addr\"" }}';
280+
281+
{{- /* See https://nginx.org/en/docs/http/ngx_http_log_module.html#log_format for details and variables
282+
* LOG_FORMAT_ESCAPE sets the escape part of the log format
283+
* LOG_FORMAT sets the log format
284+
*/}}
285+
{{- $logEscape := printf "escape=%s" ( or $globals.Env.LOG_FORMAT_ESCAPE `default`) }}
286+
{{- $logFormat := (or $globals.Env.LOG_FORMAT `$host $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$upstream_addr"`) }}
287+
288+
{{- if $globals.Env.LOG_JSON }}
289+
{{- /* LOG_JSON is a shorthand
290+
* that sets logging defaults to JSON format
291+
*/}}
292+
# JSON Logging enabled (via LOG_JSON env variable)
293+
{{- $logEscape = printf "escape=%s" ( or $globals.Env.LOG_FORMAT_ESCAPE `json`) }}
294+
{{- $logFormat = (or $globals.Env.LOG_FORMAT `{"time_local":"$time_iso8601","client_ip":"$http_x_forwarded_for","remote_addr":"$remote_addr","request":"$request","status":"$status","body_bytes_sent":"$body_bytes_sent","request_time":"$request_time","upstream_response_time":"$upstream_response_time","upstream_addr":"$upstream_addr","http_referrer":"$http_referer","http_user_agent":"$http_user_agent","request_id":"$request_id"}`) }}
295+
{{- end }}
296+
297+
log_format vhost {{ $logEscape }} '{{ or $globals.Env.LOG_FORMAT $logFormat }}';
281298

282299
access_log off;
283300

test/test_log_json.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import pytest
2+
3+
def test_log_json(docker_compose, nginxproxy):
4+
log_conf = [line for line in nginxproxy.get_conf().decode('ASCII').splitlines() if "log_format vhost escape=" in line]
5+
assert "{\"time_local\":\"$time_iso8601\"," in log_conf[0]
6+
7+
r = nginxproxy.get("http://nginx-proxy.test/port")
8+
assert r.status_code == 200
9+
assert r.text == "answer from port 81\n"
10+
sut_container = docker_compose.containers.get("sut")
11+
docker_logs = sut_container.logs(stdout=True, stderr=True, stream=False, follow=False)
12+
docker_logs = docker_logs.decode("utf-8").splitlines()
13+
docker_logs = [line for line in docker_logs if "{\"time_local\":" in line]
14+
assert "GET /port" in docker_logs[0]

test/test_log_json.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
web1:
2+
image: web
3+
expose:
4+
- "81"
5+
environment:
6+
WEB_PORTS: 81
7+
VIRTUAL_HOST: nginx-proxy.test
8+
9+
sut:
10+
container_name: sut
11+
image: nginxproxy/nginx-proxy:test
12+
volumes:
13+
- /var/run/docker.sock:/tmp/docker.sock:ro
14+
environment:
15+
LOG_JSON: 1

test/test_log_json_format.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import pytest
2+
3+
def test_log_json_format(docker_compose, nginxproxy):
4+
log_conf = [line for line in nginxproxy.get_conf().decode('ASCII').splitlines() if "log_format vhost escape=" in line]
5+
assert "{\"time_local\":\"$time_iso8601\"," in log_conf[0]
6+
7+
r = nginxproxy.get("http://nginx-proxy.test/port")
8+
assert r.status_code == 200
9+
assert r.text == "answer from port 81\n"
10+
sut_container = docker_compose.containers.get("sut")
11+
docker_logs = sut_container.logs(stdout=True, stderr=True, stream=False, follow=False)
12+
docker_logs = docker_logs.decode("utf-8").splitlines()
13+
docker_logs = [line for line in docker_logs if "{\"time_local\":" in line]
14+
assert "GET /port" in docker_logs[0]
15+
16+

test/test_log_json_format.yml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
web1:
2+
image: web
3+
expose:
4+
- "81"
5+
environment:
6+
WEB_PORTS: 81
7+
VIRTUAL_HOST: nginx-proxy.test
8+
9+
sut:
10+
container_name: sut
11+
image: nginxproxy/nginx-proxy:test
12+
volumes:
13+
- /var/run/docker.sock:/tmp/docker.sock:ro
14+
environment:
15+
LOG_FORMAT: '{"time_local":"$$time_iso8601","remote_addr":"$$remote_addr","request":"$$request","upstream_addr":"$$upstream_addr"}'

0 commit comments

Comments
 (0)
0