「Nginx」- 日志路径中使用变量

  FROM JENKINS AUTOMATION

更新日期:2019年07月10日

# access_log(ngx_http_log_module)

在指令access_log中使用变量:

access_log /home/me/sites/${server_name}.access.log;

但是需要从(0.7.6+)以后,并且存在一些限制:

# 日志文件用“工作进程”创建,所以需要在日志目录有创建文件的权限。
# 无法使用写入缓冲。
# 由于经常使用的文件描述符会被缓存,在指令open_log_file_cache的参数valid指定的时间内,还会写入旧文件中。
# 每次写入日志时,会检查root目录是否存在。不存在,则不会创建日志。

详细介绍参考「access_log」手册。

# error_log(ngx_core_module)

官方手册的「error_log」上没提可以使用变量。

(Oct 30 ’17 at 21:54)-「Nginx error log won’t read variable」- 不支持

(5 years ago)-「#562 closed enhancement (invalid)」- 不支持
根据官方的说法:
(1)官方:是故意这个设计的。变量只在HTTP请求中可用,而error_log不限于HTTP请求。
(2)官方:错误日志是个非常重要的东西。必须保证一直可用。例如,在解析/path/$var/error.log$var变量出错(比如内存分配)时,应该在哪里记录错误日志呢?
(3)官方:可以考虑在非main块以外的上下文中支持变量。

# 建议???

两个都不建议用。一个不好,一个不行。

!!!如果想要使用这种方式,建议进行性能测试,评估「没有写入缓存」、「经常打开和关闭文件」等等这些限制对性能的影响。

在「Nginx variable expansion in error_log for virtual hosts/servers」中,作者也解释了,这没什么必要。

参考文献




文章摘要:Operations_Engineer:Web_server:Nginx_and_Tengine:x.Miscellanies:variable_in_error_log_and_access_log

原文链接:「Nginx」- 日志路径中使用变量