ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# nginx日志详解 [toc] ## 一、 错误日志[默认开启] Nginx记录错误日志的功能属于核心功能模块**ngx_core_module**,参数名字是error_log,可以放在mian区块中全局配置,也可以放在不同的虚拟主机中单独记录。 1. 语法如下: `error_log file level ;` * error_log是错误日志关键字,不能修改 * file是日志文件,任意指定存放目录 * level是错误日志级别 * 常见级别有[debug|info|notice|warn|error|crit|caert|emerg]级别越高,记录的信息越少,反之就越多,不要设置info等较低级别,会带来巨大的磁盘I/O开销 >error_log默认就已经启用,默认级别crit,默认位置logs/error.log,可以放在mian、http、server、location区块内. 2. 推荐写法 推荐将错误日志级别调整为error,写在主区块[main]内. `error_log logs/error.log error; ` ## 二、 访问日志[默认开启] Nginx会把每个用户访问网站的日志信息记录到指定的文件中,供网站方分析用户行为 默认开启,可放在http、server、location、if in location、limit_except中 ### 1.格式和写法 **1)日志格式** 此功能由日志模块[ngx_http_log_module]负责,共有两个控制参数: * log_format 定义日志记录格式 * access_log 指定日志文件路径,使用何种日志格式记录 log_format默认配置入下: ```sh log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ``` **2)access_log默认写法如下:** ``` access_log logs/access.log main; ``` 可以定义多个log_format,然后access_log中选择指定的日志格式文件即可(上文的mian就是格式名) >若有需要,还可以在日志中增加如下字段 >* buffer=[size] 存放日志缓冲区 >* flush=[time] 缓冲区日志刷入磁盘时间 >* gzip 压缩传输字段可压缩后传输日志 ### 2.nginx日志格式变量解释 ```sh $remote_addr 记录访问网站的客户端地址 $remote_user 远程客户端用户名称 $time_local 记录访问时间与时区 $request 用户请求起始行信息 $status 记录请求返回的状态码 $body_bytes_sent 服务器发送给客户端的响应body字节数 $http_referer 记录该请求是从那个链接访问过来的 $http_user_agent 记录客户端类型信息,如手机端,浏览器等 $http_x_forwarded_for 走前端代理服务器获取用户访问信息,前端代理服务器也得开启此功能 ``` ### 3.真实的访问日志示例: ```sh 10.0.0.1 - - [16/Nov/2017:00:13:57 +0800] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" ``` ## 三、访问日志写法 ### 1.常规情况 在http区块中定义日志格式和输出 ```sh http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; ...... ``` ### 2.多虚拟服务器区块 较多虚拟服务器时,在http区块中定义日志格式,在每个sever中以虚拟服务器名命名日志,便于查看,示例如下: ```sh http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; ...... server { listen 80; server_name www.etiantian.omg; access_log /var/log/nginx/access.log main; ...... ``` ### 3.日志需要远程传输时[了解即可] 可以控制日志缓冲区大小,并压缩日志(gzip压缩后显示乱码,学习过程不要用) ```sh access_log logs/www_access.log main gzip buffer=32k flush=5s; ``` ## 四、Nginx访问日志轮询切割 默认情况下nginx会将所有访问日志都记录在一个文件中,日志会很大且不利于分析和处理,可以用脚本加定时任务的方式按天切割日志 **1.脚本内容如下:** ```sh cat >/servers/scripts/cut_nginx_log.sh <<"EOF" #!bin/sh cd /application/nginx/logs /bin/mv www_access.log www_access_$(date +%F -d '-1 day').log /application/nginx/sbin/nginx -s reload EOF ``` **2.定时任务如下:** ```sh crontab -l|tail -2 #cut nginx access_log 00 00 * * * /bin/sh /servers/scripts/cut_nginx_log.sh >/dev/null 2>&1 ```