Nginx 日志切割的shell脚本

  默认情况下,Nginx 的访问日志保存在一个文件里。时间久了日志内容变得异常庞大。不利于日志文件的归档备份及分析。可以通过每天定时执行脚本来达到自动切割日志的目的,达到每天的访问日志保存在一个单独文件内。

  为了切割日志,首先需要将已存在的日志重命名(默认访问日志为 access.log ,重命名为当天的日期),然后向 Nginx 的 master 进程发送 USR1 信号来使进程重新打开所有日志文件并设置日志文件的属主为 work 进程运行的用户,(此时由于 access.log 已被重命名 所以进程会新创建一个 access.log 并将属主改为 work 进程运行的用户,来记录新的访问日志)。当日志文件重新打开成功后,master 会关闭所有打开的日志文件,并通知 work 进程重新打开日志文件。work 进程以正确的方式关闭之前的日志文件,并使用新的日志文件记录。

  未进行切割之前:

[root@lnmp www]# du -h access.log
12M     access.log
[root@lnmp www]# head -n 1 access.log
120.27.47.* - - [25/Sep/2015:10:35:31 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
[root@lnmp www]# tail -n 1 access.log      
112.126.75.* - - [29/Sep/2015:12:06:54 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
[root@lnmp www]#

  使用脚本重命名日志文件,并发送 USR1 信号给 Nginx master 进程。然后将脚本加入定时任务:

  Nginx master 进程号文件保存位置:

[root@lnmp scripts]# grep pid /application/nginx/conf/nginx.conf
pid        logs/nginx.pid;
[root@lnmp scripts]# cat /application/nginx/logs/nginx.pid
7039
[root@lnmp scripts]#

  配置文件中访问日志保存路径及文件名:

[root@lnmp scripts]# grep access /application/nginx/conf/website/www.conf
    access_log /data/logs/website/www/access.log  main;
[root@lnmp scripts]

  脚本:

[root@lnmp scripts]# cat rotate-nginx-logs.sh
#!/bin/bash
# Rotate nginx logs
# Nginx pid file : /application/nginx/logs/nginx.pid
# Nginx logs directory : /data/logs/website/www
# Default log name : access.log
# Author : Mr.Zhou

NGX_PID=/application/nginx/logs/nginx.pid
LOGS_DIR=/data/logs/website/www
LOG_NAME=access.log

cd $LOGS_DIR &&
/usr/bin/rename $LOG_NAME $(/bin/date +%F -d 'yesterday').$LOG_NAME $LOG_NAME &&
/bin/kill -USR1 $(cat $NGX_PID)
[root@lnmp scripts]#

  将脚本加入到定时任务,每天零点执行:

[root@lnmp scripts]# crontab -l
# rotate nginx log everyday
00 00 * * * /bin/bash /application/scripts/rotate-nginx-logs.sh &>/dev/null
[root@lnmp scripts]#

  定时任务自动执行切割脚本后:

[root@lnmp www]# ls
2015-09-29.access.log  access.log
[root@lnmp www]# tail -n 1 2015-09-29.access.log
112.126.75.174 - - [29/Sep/2015:23:59:54 +0800] "HEAD / HTTP/1.1" 200 0 "-" "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)" "-"
[root@lnmp www]# head -n 1 access.log               
45.119.97.12 - - [30/Sep/2015:00:00:31 +0800] "POST /wp-cron.php?doing_wp_cron=1443542431.7503929138183593750000 HTTP/1.0" 200 0 "-" "WordPress/4.3.1; http://www.111cn.net" "-"
[root@lnmp www]#

时间: 2024-10-15 20:22:37

Nginx 日志切割的shell脚本的相关文章

nginx日志切割脚本分享_linux shell

实现方法一 #!/bin/bash Logs_path="/data/Application/nginx/logs" Pid_path="/data/Application/nginx/nginx.pid" Month=`date +%Y-%m` Date=`date +%Y-%m-%d` Time=`date +%H` WaitTime=$((24*60*60)) LogCut() { cd $Logs_path mkdir -p $Month while tru

nginx日志切割shell脚本_linux shell

一.脚本思路 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志.在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件. 第二步向nginx主进程发送USR1信号. nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者. 重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件.

linux中NGINX日志切割和定时删除旧日志例子

  在nginx日志切割方面,我的方法和其他人用的方法有一些不一样,但对于我这种方法,如果有人觉得不好,可以给我提出,谢谢 nginx日志切割,我是直接写的一个简单的shell实现的,内容如下:  代码如下 复制代码 mv /usr/local/nginx/logs/abc.log /www/logbak/abc`date +%Y%m%d%H%M`.log /usr/local/nginx/sbin/nginx -s reload 这样执行以后,就会在/www/logbak目录下生成日志文件,你

nginx日志切割的几个例子

例子1 1. 定义日志轮滚策略 # vim nginx-log-rotate /data/weblogs/*.log {     nocompress     daily     copytruncate     create     notifempty     rotate 7     olddir /data/weblogs/old_log     missingok     dateext     postrotate         /bin/kill -HUP `cat /var/r

nginx日志切割及删除7天前的历史日志shell脚本

例子一.按日期切割nginx日志,并自动删除7天前的日志(日志均已同步至专用日志存储服务器,可放心删除历史日志.) #!/bin/bash #初始化 LOGS_PATH=/data/nginx/logs/www.domain.com YESTERDAY=$(date -d "yesterday" +%Y-%m-%d) #按天切割日志 mv ${LOGS_PATH}/access.log ${LOGS_PATH}/access_${YESTERDAY}.log #向 Nginx 主进程发

linux系统下Nginx 日志切割的例子

默认情况下,Nginx 的访问日志保存在一个文件里.时间久了日志内容变得异常庞大.不利于日志文件的归档备份及分析.可以通过每天定时执行脚本来达到自动切割日志的目的,达到每天的访问日志保存在一个单独文件内.   为了切割日志,首先需要将已存在的日志重命名(默认访问日志为 access.log ,重命名为当天的日期),然后向 Nginx 的 master 进程发送 USR1 信号来使进程重新打开所有日志文件并设置日志文件的属主为 work 进程运行的用户,(此时由于 access.log 已被重命名

Shell脚本切割tomcat的日志文件_linux shell

鉴于在调试logback和log4j的文件切割一直无法成功,随性用shell写个脚本用来切割tomcat下的日志文件(大家如果有在logback或log4j使用文件切割成功的话,可以留下使用方式,先谢谢了) 1:废话少说,直接贴上脚本: #!/bin/sh log_dir=/var/log/tomcat monitor_file=$1 #tomcat目录下的catalina.out文件的绝对路径 file_size=`du $monitor_file | awk '{print $1}'` if

linux Nginx 日志脚本_linux shell

任务计划 crontab -l 1 15 * * * /home/dongnan/sh/split.sh >> /home/dongnan/sh/cron.log 2>& nginx 日志 ls /var/log/nginx/ 20130730-access.log.gz  20130801-access.log.gz  20130803-access.log.gz 20130730-error.log.gz   20130801-error.log.gz   20130803-

Linux系统下nginx日志每天定时切割的脚本写法_nginx

使用Linux系统自带的命令logrotate对Nginx日志进行切割. Nginx安装目录:/usr/local/nginx/ Nginx日志目录:/usr/local/nginx/logs/./usr/local/nginx/logs/nginx_logs/ 1.添加nginx日志切割脚本 cd /etc/logrotate.d #进入目录 vi /etc/logrotate.d/nginx #编辑脚本 /usr/local/nginx/logs/*.log /usr/local/nginx