覆盖Nginx access_log指令-重复的日志条目


16

我在Ubuntu 14.04服务器上使用默认的nginx软件包。它/etc/nginx/nginx.conf用作主要配置,然后包括/etc/nginx/conf.d/*.conf和中的配置/etc/nginx/sites-enabled/*

默认的nginx配置具有此指令,用于记录访问日志

access_log /var/log/nginx/access.log;

我想添加X-Forwarded-For标头,所以我在conf.d文件夹内执行此操作:

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                 '$status $body_bytes_sent "$http_referer" '
                 '"$http_user_agent" "$http_x_forwarded_for"';

access_log  /var/log/nginx/access.log  main;

我的问题是,然后我在access.log文件中得到了两条记录-一个包含标题信息,另一个没有标题。

我知道我可以覆盖nginx.conf文件本身,但是如果可能的话,我宁愿避免它。我也想继续使用相同的日志文件(access.log)。

有没有一种方法可以告诉Nginx覆盖先前的指令,并且只需更改日志格式而不修改主nginx.conf文件?


不。只需将其从nginx.conf中删除
Alexey

1
我为此开了票;trac.nginx.org/nginx/ticket/1084
cweiske

Answers:


4

问题的答案是“否”,您无法覆盖nginx中任何级别的log_format,并且在同一级别中不能覆盖access_log,除非将其关闭。但是,您可以在不更改nginx.conf的情况下实现所需的功能,但是必须在服务器{}级别执行。

这里的问题是conf.d / *的include位于http {}内,这正是access_log指令所在的位置。您可以在不触摸nginx.conf的情况下更改正在使用的任何服务器{}(如果未设置服务器,则将使用位于/ etc / nginx / sites-enabled / default的默认服务器)。因此,要在不更改nginx.conf的情况下实现相同目的,应将conf.d文件夹中的文件更改为: log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log off;

然后在您的服务器{}中放入: access_log /var/log/nginx/access.log main;

刚开始您应该会得到想要的东西。


谢谢,效果很好。除了通常已经有一个mainlog_format之外,因此您需要选择另一个名称。
库奇(Kutzi)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.