首页 文章 正文 Nginx-日志 2024-03-22 963阅读 0评论 一、Nginx日志管理范围 Nginx日志相关属性可以配置在任意模块。在不同的模块,记录的是不同请求的日志信息。即,日志记录的请求范围是不同的。Nginx日志一般可以指定三个范围:http{}模块范围、server{}模块范围,与location{}模块范围。 1.1、http{}模块范围 只要有请求通过http协议访问该Nginx,就会有日志信息写入到这里的日志文件。 1.2、server{}模块范围 只要有请求访问当前Server,就会有日志信息写入到这里的日志文件。 1.3、location{}模拟范围 只要有请求访问当前location,就会有日志信息写入到这里的日志文件。 二、日志管理指令 下面以http{}模块下的日志为例来学习Nginx日志管理指令。 Nginx的日志分为两类:访问日志与错误日志。Nginx整个系统的默认日志在生成预编译文件makefile时就已经默认给配置好了。当然,无论是访问日志还是错误日志,其默认路径与名称在nginx.conf中均是可以修改的。在配置文件中不仅定义了日志文件的路径及名称,还定义了日志格式。 2.1、 log_format 用于设置访问日志的格式,其后的main是为该格式所起的名称,可以任意,而其后面的内容则为具体格式,通过Nginx内置变量定义。 $remote_addr:获取访问者的IP地址。若当前Nginx是反代服务器,则此变量获取到的就是客户端的IP地址;若当前Nginx是静态代理服务器,则此变量获取到的是反代服务器的IP地址。 $http_x_forwarded_for:获取客户端浏览器的IP。若当前Nginx是反代服务器,则此变量获取到的值为杠(-)。若当前Nginx是静态代理服务器,则此变量获取到的是客户端的IP地址。 $remote_user:获取访问者的用户名。 $time_local:获取请求访问的时间与时区。 $request:获取请求的相关信息,包含请求方式、请求的URI,及访问协议。 $status:后端服务器向其返回的状态码,例如200。 $body_bytes_sent:后端服务器向客户端发送的响应体内容字节数。 $http_referer:获取当前请求是从哪个页面过来的。其值在这里显示为杠(-)。 $http_user_agent:用户所使用的代理,一般为浏览器。 2.2、access_log 该指令用于设置访问日志。上面的格式包含三个参数: 第一个参数是日志的存放路径与日志文件名; 第二个参数是日志格式名; 第三个参数是日志文件所使用的缓存。不过,即使不指定buffer,其也会存在默认日志缓存的。 access_log还可以跟一个参数off,用于关闭访问日志,即直接写access_log off即可关闭访问日志。 2.3、error_log 该指令用于指定错误日志的路径与文件名。需要注意以下几点: 其不能指定格式,因为其有默认格式。 可以使用自己指定的错误日志文件,不过,将来的访问异常日志就不会再写入到默认的logs/error.log文件中了。所以关于错误日志,一般使用默认的即可。 错误日志级别由低到高有:[debug | info | notice | warn | error | crit | alert | emerg],默认为error,级别越高记录的信息越少。 错误日志默认是开启的。关闭错误日志的写法为 error_log /dev/null; 2.4、open_log_file_cache 该指令用于打开日志文件读缓存,将日志信息读取到缓存中,以加快对日志的访问。该功能默认为off,即open_log_file_cache off; 三、Nginx日志做自动分割 nginx运行时间长后会导致日志文件过多过大,导致磁盘空间被占满。这里用logrotate来分割nginx日志文件。 3.1、logrotate是什么? Logrotate 是 CentOS 操作系统内置日志管理工具,该工具可对系统中生成的大量日志文件进行归档管理,其允许对日志文件实行压缩、删除或邮寄等操作。Logrotate 可以按照每天、周、月或达到某一大小的日志文件进行归档操作,Logrotate 基于 anacrontab 实现计划任务,只需在 /etc/logrotate.d 目录下编写相关日志管理配置文件,就可以无须人工干预使用自动化方式完成日志归档操作。 3.2 、logrotate安装 yum -y install logrotate 3.3 、logrotate文件目录 /etc/logrotate.conf # logrotate主配置文件 /usr/sbin/logrotate # logrotate二进制文件 /etc/logrotate.d/ # 自定义logrotate配置文件 /var/lib/logrotate/logrotate.status # logrotate管理日志执行记录的状态文件 3.4、logrotate命令参数 [root@iZwz9i2lb8n41lkr9p29z0Z ~]# logrotate --help 用法: logrotate [OPTION...] <configfile> -d, --debug Don't do anything, just test and print debug messages -f, --force Force file rotation -m, --mail=command Command to send mail (instead of `/bin/mail') -s, --state=statefile Path of state file -v, --verbose Display messages during rotation -l, --log=logfile Log file or 'syslog' to log to syslog --version Display version information 帮助选项: -?, --help 显示这个帮助信息 --usage 显示简短的使用说明 3.5、logrotate常用配置参数 logrotate的主要的配置参数文件是/etc/logrotate.conf ,而/etc/logrotate.d/目录中的写配置是为了平时管理方便在里面写的,它最后还是会被/etc/logrotate.conf所include,最后由wtmp所执行。所以如果是一些通用的配置都可以写在/etc/logrotate.conf文件中,但是如果平时不建议对默认的/etc/logrotate.conf文件做太大的改动,至于logrotate.conf中的配置语法很简单: 日志文件名的绝地路径(如果是多个用空格隔开) { 需要配置的参数 } logrotate功能实现的最重要的就是它的配置参数,这里列出一些常用的参数: compress 启用压缩,指的是轮替后的旧日志,这里默认用的是gzip压缩的 compressoptions 以gzip -9的模式压缩 uncompresscmd 解压日志,默认是gunzip daily 每天轮替选项 dateext 轮替的日志文件会附加上一个短横线和YYYYMMDD格式的时间戳 delaycompress 将以前的日志文件压缩推迟到下一次轮替 ifempty 即使日志文件是空的也轮替 mail 将轮替后的文件发送到指定E-mail地址 copytruncate 用于还在打开中的日志文件,把当前日志备份并截断,开始轮替 mailfirst/maillast 向邮件发送轮替文件/轮替后历史文件(默认) monthly 一个月轮替一次 nocompress 如果在logrotate.conf中启用了压缩,这里是做不用压缩的参数 nomail 不发送邮件到任何地址 ifempty 如果日志时空的就不轮替 olddir directory 轮替后日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 postrotate/endscript 在做完轮替后的命令,两个关键字必须单独成行,使用的操作在2者之间相当于分组“{}”,注意的使用外部指令时要用绝对路径 prerotate/endscript 在做轮替前的命令,同上 rotate count 轮替最多保留之前的数据几次,超出的将被删除或邮件接收,设为0则不保存 size size 当日志增长到指定大小的时候开始轮替,它不会考虑 start count 轮替文件名基于这个数字。例如,指定0时,原日志文件轮替的备份文件以.0为扩展名,如果指定9,就直接从.9开始跳过0-8然后再继续向后轮替rotate指定的次数。 weekly 如果当前的星期几比上次轮替的星期几少,或者过了一个多星期,就会发生轮替通常是在每周的第一天轮替,如果logrotate不是每天运行的,会在第一次有机会时进行轮替。 yearly 如果当前年份不同于上次轮替的年份,则进行日志轮替 create mode owner group 在轮替动作之后,postrotate脚本执行之前,立即使用刚轮替的日志文件名创建日志文件。 MODE 指定日志文件的权限(0660之类) OWNER 指定日志文件的属主 GROUP 指定日志文件的属组 extension ext 日志文件可在轮替后使用指定的EXT扩展名。如果使用压缩,通常EXT后还会加上压缩文件的扩展名,通常是.gz。例如想把mylog.foo轮转为mylog.1.foo.gz而不是mylog.foo.1.gz 示例,只需要把脚本放到/etc/logrotate.d目录下即可。 /data/logs/nginx/*log # 这里也可以写明对具体哪几个文件进行切割 { su root root daily #每天切割 dateext #日志切割后,文件以当前日志为结尾,例如:access-logs-20211128 missingok #日志不存在分析,分析下一个 rotate 30 notifempty #空文件不转储 compress #被切割的日志文件需要压缩 sharedscripts #整个日志组运行一次脚本 postrotate #开始脚本 [ -f /home/nginx/logs/nginx.pid ] && kill -USR1 `cat /home/nginx/logs/nginx.pid` endscript #结束脚本 }
发表评论
还没有评论,来说两句吧...