5

在设置 nginx 日志时需要一些帮助,以免它们重复。

我的配置如下。我想要实现的是所有日志,例如http://example.com/app进入文件 app.access.log 和网站其余部分的日志进入文件 main.access.log

但是,以下配置将应用程序日志记录到 app.access.log 和 main.access.log。

server {

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


       location /app {
           access_log /var/log/nginx/app.access.log;
       }
}

知道如何解决这个问题吗?

4

2 回答 2

2

您可以使用否定正则表达式来拦截所有未定向到应用程序的请求,并在那里定义 access_log 指令。然后为应用定义另一个位置

location ~ ^((?!app).)*$ {
        access_log /var/log/nginx/not-an-app.access.log;
   }

location /app { 
       access_log /var/log/nginx/app.access.log;
   }

我认为这有点牵强,我会在将其投入生产之前对其进行测试。

于 2018-10-12T08:19:56.370 回答
0

access_log指令包括一个if=condition可用于控制日志记录。

例如:

map $request_uri $loggable {
    ~^/app  0;
    default 1;
}
server {
    access_log /var/log/nginx/main.access.log if=$loggable;
    ...
}

有关详细信息,请参阅此文档

另一种方法是将所有内容记录在一起,稍后使用grep.


受@Andrea 解决方案的启发,您也可以使用这种模式:

server {
    location / {
        access_log /var/log/nginx/main.access.log;

        location /foo { ... }
        location /bar { ... }
        ...
    }
    location /app {
        access_log /var/log/nginx/app.access.log;
    }
}

所以顶层只有两个顶层location块,所有其他location块都嵌套在默认的`location.

于 2018-10-12T08:20:15.563 回答