一、日志配置
1.1 访问日志
access_log指令
语法 access_log 日志文件路径 日志格式
定义日志格式的指令log_format
Syntax: log_format 日志名 日志格式 log_format的定义位置:定义在http块内 log_format定义的日志在何处使用:server块内
日志格式相关参数
$remote_addr # 记录客户端IP地址 $remote_user # 记录客户端用户名 $time_local # 记录通用的本地时间 $time_iso8601 # 记录ISO8601标准格式下的本地时间 $request # 记录请求的方法以及请求的http协议 $status # 记录请求状态码(用于定位错误信息) $body_bytes_sent # 发送给客户端的资源字节数,不包括响应头的大小 $bytes_sent # 发送给客户端的总字节数 $msec # 日志写入时间。单位为秒,精度是毫秒。 $http_referer # 记录从哪个页面链接访问过来的 $http_user_agent # 记录客户端浏览器相关信息 $http_x_forwarded_for #记录经过的所有服务器的IP地址 $X-Real-IP #记录起始的客户端IP地址和上一层客户端的IP地址 $request_length # 请求的长度(包括请求行, 请求头和请求正文)。 $request_time # 请求花费的时间,单位为秒,精度毫秒 # 注:如果Nginx位于负载均衡器,nginx反向代理之后, web服务器无法直接获取到客 户端真实的IP地址。 # $remote_addr获取的是反向代理的IP地址。 反向代理服务器在转发请求的http头信息中, # 增加X-Forwarded-For信息,用来记录客户端IP地址和客户端请求的服务器地址。
示例
http { log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; log_format custom '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" ' '"$host" "$http_cookie"'; server { listen 80; server_name localhost; access_log logs/access.log main; # 使用main日志格式记录访问日志 error_log logs/error.log; # 记录错误日志 location / { root /var/www/html; index index.html index.htm; } } server { listen 8080; server_name localhost; access_log logs/access.log custom; # 使用custom日志格式记录访问日志 error_log logs/error.log; # 记录错误日志 location / { root /var/www/html; index index.html index.htm; } } }
1.2 nginx的运行日志
error_log指令:挺起来像是只记录报错日志,但其实包含了很多日志级别
error_log 日志文件路径 日志级别
日志级别
Nginx的日志级别从低到高包括以下几种: debug: 这是最低级别的日志,用于调试Nginx。这个级别的日志记录了大量的详细信息,对于调试很有价值,但是在生产环境中通常是禁用的,因为它会产生大量的日志数据。 info: 这个级别的日志记录了一般的运行时事件信息。 notice: 这个级别的日志记录了比较重要的正常运行时事件。 warn: 警告级别的日志表示可能出现的一些问题,虽然这些问题不会立即影响服务器的运行,但是可能需要引起注意。 error: 错误级别的日志记录了导致某个特定操作或请求失败的错误事件,如反向代理一个失败的请求或者连不上FastCGI服务器。 crit: 这是比错误更严重的一类事件,如连接池耗尽、服务器宕掉一个子进程等。 alert: 这个级别的日志记录了需要立即采取行动的问题,如系统磁盘被写满。 emerg: 这是最高级别的日志,这类日志事件表示系统不可用,如非预期的主进程崩溃或者服务器声明“Out of memory”。 在默认情况下,如果不指定日志级别,Nginx会记录error级别及以上的日志。如果指定了日志级别,Nginx会记录指定级别及以上的所有日志。例如,如果设置了warn级别,Nginx会记录warn、error、crit、alert、emerg这几个级别的日志。
说明:error_log的日志格式是固定的,不能自定义
error_log主要用于记录Nginx在运行过程中的错误信息, 这些信息的内容和格式是由Nginx预设并且固定的。 这样的设计可以保证错误信息的一致性和可读性,让用户在检查日志时可以更方便地定位和分析问题
Nginx的错误日志(error_log)的条目通常会包含以下部分信息:
- 日期和时间:显示了错误信息被记录的日期和时间。例如,”2021/06/17 13:00:00″ 显示的是在2021年6月17日的13点整,Nginx记录了一个错误信息。
- 错误级别:这是一个表示错误严重程度的单词,例如”warn” (警告)、”error” (错误)、”crit” (严重)、”alert” (警报)、”emerg” (紧急).
- 错误描述:这是一段简短的文本,描述了错误的具体信息。例如,“client intended to send too large body”告诉您客户端试图发送过大的请求主体。
- 附加信息:一些额外的信息,可能包含导致错误的请求的具体细节,例如客户端IP地址、请求的URL等。
二、日志切割
由lograte工具管理,配置如下
[root@web01 /var/log/nginx]# cat /etc/logrotate.d/nginx /var/log/nginx/*.log { # 指定要切割的日志 daily #每天切割日志 missingok #忽略日志丢失 rotate 52 #日志保留时间 52天 compress #日志压缩 delaycompress #延时压缩 not if empty #不切割空日志 create 640 nginx adm #切割好的日志权限 sharedscripts #开始执行脚本 postrotate #标注脚本内容 if [ -f /var/run/nginx.pid ]; then#判断nginx启动 kill -USR1 `cat /var/run/nginx.pid` #access.log不存在时,重新生成一个,存在则继续用已存在的不会产生新的access.log fi endscript #脚本执行完毕 }
说明
在Linux系统中,logrotate工具不运行为一个系统服务,因此你不能使用 systemctl status logrotate 命令查看其状态, 因为它不是一个持续运行的后台服务,而是由cron定时任务调度的一个程序。 logrotate通常是作为一个定时任务来运行的。它的运行通常由系统的cron daemon控制。 默认情况下,logrotate的定时任务通常在/etc/cron.daily/目录下,且文件名为logrotate。 你可以查看这个文件以确认logrotate是否被正确地设置为一个定时任务。 你可以使用以下命令来测试logrotate配置是否正确: /usr/sbin/logrotate -d /etc/logrotate.conf 加上-d选项,logrotate将运行在调试模式下,显示出它将会进行哪些操作,但是不会真正执行这些操作。 同时,你可以使用下列命令来强制执行一次logrotate: /usr/sbin/logrotate -f /etc/logrotate.conf /usr/sbin/logrotate -f /etc/logrotate.d/nginx