如何自定义CentOS Nginx日志,高效解决复杂问题?
- 内容介绍
- 文章标签
- 相关推荐
不是服务器宕机,而是宕机时日志里啥都没有或者日志全挤在一个 access.log 里几十个虚拟主机的请求糅合在一起。想排查一个慢查询、统计一个特定 IP 的行为、对接 ELK 日志网站,全都无从下手。
默认日志格式是“万金油”,但不是“良药”。话说回来,它记不住上游响应时间、记不住真实客户端 IP、更不支持 JSON 结构化输出。 每次排查问题都要写正则切割日志,效率低、易出错。
CentOS + Nginx 是黄金搭档。但只有自定义日志格式、按天切割、多虚拟主机隔离落地了才能真正把“眼睛”擦亮,高效解决复杂问题。
🛠️ 前置准备:环境与文件定位
-
程序环境: CentOS,稳定的内核与长周期支持是生产首选。
-
主要组件: Nginx 高性能 Web/反向代理服务。
-
配置文件位置:
/etc/nginx/nginx.conf(主配置,http/log_format
常驻于此)或站点配置目录 /etc/nginx/conf.d/.conf//etc/nginx/sites-enabled/}
中。
📝
说到主要步骤一。在
<
代码
类
中定义
< 代码 >
log_format
( 自定义 日志 格式 ) < / H >
log_format
指令只能在http
块中使用,
决定了日志的“长相”。建议直接编辑主配置文件:
<代码> sudo vim /etc/nginx/nginx.conf < /代码> < h3> 至于示例一,标准文本提高版 < / h3>> < 预言><代码>> http { ... # 建议命名具有业务含义的名字。
如 main_custom、
projectaccess logformat maincustom '$remoteaddr $httpxforwardedfor' # 包含真实 IP 和代理链 '- $remoteuser ' # 时间 '"$request"' # 原始请求行 '$status $bodybytessent' # 响应状态码与发送字节数 '"$httpreferer"' # Referer来源 '"$httpuseragent"' # User-Agent '"$upstreamaddr"' # 上游服务器地址 '$upstreamresponsetime' # 上游响应时间 '$requesttime';# 整个请求总耗时 ... } < /代码>< /预言>>
JSON
结构化格式(专为 ELK/EFK、
Loki 、ClickHouse
等分析网站设计——痛点终结者)
< / h3>
如果你还在用 awk/grep 分析日志,
请立即切换 JSON。
字段自动映射。
无需写 Grok
正则,
直接入库查询。< / p> < pre> >< code>> http { ... logformat nginxjson escape=json '{ "@timestamp": "$time_iso8601",
利于时序库索引 "@timestamp_received": "$msec",
remoteaddr ": "$remoteaddr",
xforwardedfor ": "$httpxforwarded_for",
remoteuser ": "$remoteuser",
request ": "$request",
status ": $status,
便于范围查询 "
bodybytessent ": $bodybytessent。
"
requestlength ": $requestlength,
requesttime ": $requesttime,
upstreamresponsetime ": "$upstreamresponsetime",
"-" 若无上游 "
upstreamaddr ": "$upstreamaddr",
端口 "
http_host ": "$host",
uri ": "$uri",
args ": "$args",
referer ": "$http_referer",
useragent ": "$httpuser_agent"
。
不是服务器宕机,而是宕机时日志里啥都没有或者日志全挤在一个 access.log 里几十个虚拟主机的请求糅合在一起。想排查一个慢查询、统计一个特定 IP 的行为、对接 ELK 日志网站,全都无从下手。
默认日志格式是“万金油”,但不是“良药”。话说回来,它记不住上游响应时间、记不住真实客户端 IP、更不支持 JSON 结构化输出。 每次排查问题都要写正则切割日志,效率低、易出错。
CentOS + Nginx 是黄金搭档。但只有自定义日志格式、按天切割、多虚拟主机隔离落地了才能真正把“眼睛”擦亮,高效解决复杂问题。
🛠️ 前置准备:环境与文件定位
-
程序环境: CentOS,稳定的内核与长周期支持是生产首选。
-
主要组件: Nginx 高性能 Web/反向代理服务。
-
配置文件位置:
/etc/nginx/nginx.conf(主配置,http/log_format
常驻于此)或站点配置目录 /etc/nginx/conf.d/.conf//etc/nginx/sites-enabled/}
中。
📝
说到主要步骤一。在
<
代码
类
中定义
< 代码 >
log_format
( 自定义 日志 格式 ) < / H >
log_format
指令只能在http
块中使用,
决定了日志的“长相”。建议直接编辑主配置文件:
<代码> sudo vim /etc/nginx/nginx.conf < /代码> < h3> 至于示例一,标准文本提高版 < / h3>> < 预言><代码>> http { ... # 建议命名具有业务含义的名字。
如 main_custom、
projectaccess logformat maincustom '$remoteaddr $httpxforwardedfor' # 包含真实 IP 和代理链 '- $remoteuser ' # 时间 '"$request"' # 原始请求行 '$status $bodybytessent' # 响应状态码与发送字节数 '"$httpreferer"' # Referer来源 '"$httpuseragent"' # User-Agent '"$upstreamaddr"' # 上游服务器地址 '$upstreamresponsetime' # 上游响应时间 '$requesttime';# 整个请求总耗时 ... } < /代码>< /预言>>
JSON
结构化格式(专为 ELK/EFK、
Loki 、ClickHouse
等分析网站设计——痛点终结者)
< / h3>
如果你还在用 awk/grep 分析日志,
请立即切换 JSON。
字段自动映射。
无需写 Grok
正则,
直接入库查询。< / p> < pre> >< code>> http { ... logformat nginxjson escape=json '{ "@timestamp": "$time_iso8601",
利于时序库索引 "@timestamp_received": "$msec",
remoteaddr ": "$remoteaddr",
xforwardedfor ": "$httpxforwarded_for",
remoteuser ": "$remoteuser",
request ": "$request",
status ": $status,
便于范围查询 "
bodybytessent ": $bodybytessent。
"
requestlength ": $requestlength,
requesttime ": $requesttime,
upstreamresponsetime ": "$upstreamresponsetime",
"-" 若无上游 "
upstreamaddr ": "$upstreamaddr",
端口 "
http_host ": "$host",
uri ": "$uri",
args ": "$args",
referer ": "$http_referer",
useragent ": "$httpuser_agent"
。
