Nginx tcp反向代理记录日志


对于Nginx访问日志,大家都很熟悉,但是对于tcp代理来说,到底能不能记录访问日志呢? 想了一下,貌似不能啊,因为毕竟访问日志里面记录的元素都是http协议的。

但是当我去搜索时,的确搜到了相关的文档,索性先试试看,测试后发现确实可以。

修改nginx配置文档/usr/local/nginx/conf/nginx.conf 设置日志格式

stream {
 log_format proxy '$remote_addr [$time_local] '
 '$protocol $status $bytes_sent $bytes_received '
 '$session_time "$upstream_addr" '
 '"$upstream_bytes_sent" "$upstream_bytes_received" "$upstream_connect_time"';
 include ./conf.d/*.tcpstream;
}

修改具体的tcp配置文档

server{
 error_log /opt/log/device5001_error.log;
 access_log /opt/log/device5001_access.log proxy;
 listen 5001;
 proxy_pass device5001;
}

 

日志如下:

 

但是,需要提醒你的是:

nginx会等待session结束才会记录到日志文件;
session日志只是tcp层面的记录,包括session时间,发送接收字节数等等;
session内部发送日志(比如一个socket连接建立起来以后,多次发送心跳数据)需要在应用层面才能记录;