nginx需在log_format中显式添加$http_accept_language变量才能记录客户端语言偏好,该变量原样捕获accept-language请求头值,用于分析用户语言分布;配置后可通过awk等工具提取主语言并统计占比。

要让 Nginx 访问日志记录客户端语言偏好(即 Accept-Language 请求头),关键不是“默认记录”,而是主动在自定义日志格式中引入 $http_accept_language 变量。它本身不参与访问控制,但能帮你识别多语言用户分布,支撑本地化策略和内容投放分析。
在 log_format 中添加语言字段
编辑 nginx.conf 的 http 块,定义一个含语言信息的日志格式:
log_format lang_log '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" "$http_user_agent" '
'"$http_accept_language"';
说明:
• $http_accept_language 会原样捕获请求头值,例如 zh-CN,zh;q=0.9,en;q=0.8
• 它是小写变量名,注意下划线和大小写,写成 $http_Accept_Language 无效
• 若该请求头不存在,对应位置将记录为短横线 -
在 server 或 location 中启用该格式
确保日志路径有写权限,并引用刚定义的格式名:
server {
access_log /var/log/nginx/lang_access.log lang_log;
# 其他配置...
}
如只对特定路径(如多语言 API 接口)记录语言信息,可缩小作用域:
location /api/v1/content {
access_log /var/log/nginx/api_lang.log lang_log;
}
用命令行快速分析语言分布
日志生成后,可用标准工具提取和聚合语言偏好:
- 提取前 5 个最常见语言标签(取第一个逗号前主语言):
awk -F'"' '{print $NF}' /var/log/nginx/lang_access.log | cut -d',' -f1 | sort | uniq -c | sort -nr | head -5 - 统计带
zh(中文)或en(英文)的请求占比:
awk -F'"' '$NF ~ /zh/ {zh++} $NF ~ /en/ {en++} END {print "zh:", zh+0, "en:", en+0}' /var/log/nginx/lang_access.log - 过滤掉空值和无效项(避免
-或空白干扰统计):
awk -F'"' 'NF>=6 && $NF != "-" && $NF !~ /^ *$/ {print $NF}' /var/log/nginx/lang_access.log
注意事项与常见问题
• $http_accept_language 是只读变量,不能被 set 或 rewrite,仅用于记录与读取
• 不代表用户“实际使用语言”,只是浏览器声明的偏好顺序;真实语言需结合用户行为、地理 IP、登录资料交叉验证
• 高并发下频繁写入完整 Accept-Language 字符串会略微增加日志体积,若只需主语言,可在应用层或日志采集端做截断(如用 Filebeat 处理)
• 若前端有 CDN,且 CDN 未透传该头,Nginx 将收不到——需检查 CDN 控制台是否开启 Accept-Language 回源透传











