一、日志配置
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