要实现access_log联动本地Syslog秒级异地脱水备份,需:1.定义精简日志格式只保留必要字段;2.通过命名管道+logger将日志送入local6.info;3.配置rsyslog以queue.dequeuebatchsize="1"实现秒级TCP转发并过滤字段;4.远程syslog服务独立落盘并启用同步写入。

要实现 access_log 联动本地 Syslog 服务,完成核心路径访问数据与状态码的秒级异地脱水备份,关键在于:让 Nginx(或其他 Web 服务器)将指定格式的日志实时发往本地 rsyslog 或 syslog-ng,再由该服务转发至远程 Syslog 服务器,并在传输前完成字段精简(即“脱水”)。
1. 定义精简版 access_log 格式
脱水的核心是只保留必要字段——如时间、客户端 IP、请求路径、HTTP 方法、状态码、响应大小、User-Agent 关键标识。避免记录 cookie、完整 header、大 body 等冗余内容。
在 Nginx 配置中添加:
log_format minimal '$time_iso8601|$remote_addr|$request_method|$request_uri|$status|$body_bytes_sent|$http_user_agent'; access_log /var/log/nginx/access.log minimal;
注意:不要直接写 syslog:// 地址到 access_log 指令(Nginx 开源版不支持原生 syslog 协议发送),需通过 pipe 或 syslog socket 中转。
2. 配置 Nginx 日志输出到本地 Unix Socket
使用 Nginx 的 syslog 模块(需编译时启用 --with-http_syslog_module,或用第三方模块如 nginx-syslog-module),或更通用的方式:用 named pipe + inotify + logger 工具。
推荐轻量方案(无需重编译):
- 创建命名管道:
mkfifo /var/log/nginx/syslog.pipe - 修改 access_log 指向该 pipe:
access_log /var/log/nginx/syslog.pipe minimal; - 启动一个后台进程持续读取 pipe 并调用 logger:
while true; do cat /var/log/nginx/syslog.pipe | logger -t nginx-access -p local6.info; done &
这样每条日志会作为 syslog 消息,打上 local6.info 优先级,进入本地 rsyslog 缓冲队列。
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
3. 配置 rsyslog 实现秒级转发与字段过滤
编辑 /etc/rsyslog.conf 或新建 /etc/rsyslog.d/20-nginx-forward.conf:
# 启用 imfile(若需文件监听)或直接接收 pipe 输出
module(load="imuxsock") # 支持 Unix socket 接收 logger 输入
<h1>匹配 nginx-access 标签日志,做字段提取与重写(脱水)</h1><p>template(name="NginxMinimal" type="string" string="%timestamp% %hostname% nginx[%procid%]: %msg%\n")</p><h1>只允许 local6.info 级别且含特定分隔符的日志转发</h1><p>if $programname == 'nginx-access' and $syslogfacility-text == 'local6' then {</p><h1>秒级发送(禁用批处理,启用 immediate flush)</h1><p>action(type="omfwd" Target="syslog.example.com" Port="514" Protocol="tcp" Template="NginxMinimal" TCP_Framing="on" RebindInterval="30" queue.filename="nginx_fwd" queue.size="100000" queue.dequeuebatchsize="1" queue.maxdiskspace="1g" queue.saveonshutdown="on")
stop
}</p>关键点:
- queue.dequeuebatchsize="1" 确保单条日志立即发出,实现秒级延迟
- 用
Template控制输出格式,可进一步用property提取 $msg 中的竖线分隔字段,丢弃不需要的部分(如 User-Agent 全量) - 远程目标建议用 TCP+TLS(端口 6514),避免 UDP 丢包;若必须 UDP,加
action.resumeRetryCount="-1"保活
4. 远端 Syslog 服务接收与落盘
在异地服务器(如 ELK 前置节点或专用 syslog collector)部署 rsyslog 或 syslog-ng,监听 TCP 514:
- 配置 rule 针对 facility local6 创建独立日志文件:
*.*;local6.none /var/log/syslog+local6.* /var/log/nginx/remote-access.log - 开启
$ActionFileEnableSync on或使用omfile的 sync="on",确保落盘不丢失 - 可配合 logrotate 按小时切分、gzip 压缩,满足长期归档合规要求
此时,原始 access_log 中的核心字段(路径、状态码、IP、时间)已以标准 syslog 格式抵达异地,体积降低 60%~90%,且端到端延迟稳定在 1~3 秒内。

















