nginx/squid日志分割问题
今天需要有个问题需要对nginx的日志进行切割,发现nginx不支持"|/usr/bin/cronolog"切割,同样squid也不支持"|/usr/bin/cronolog"这种方式切割日志,在网络找到了一个好的方法,就是使用命名管道方式将日志输出到一个管道文件,之后使用脚本对管道文件进行cronolog的分割,并针对nginx写了一个脚本,控制nginx的启动,重新登陆配置文件,关闭nginx的操作(测试系统为debian).
脚本如下:
#!/bin/bash
#set env
LOGPATH="/home/weblogs"
CHNEL_CONF="/opt/sbin/logs/channel.conf"
SOURCLOG_DIR="/home/source_log/"
NGINX_PATH="/opt/modules/nginx/sbin/nginx"
CRONLOG="/usr/bin/cronolog"
PIPE="/home/weblogs/nginx_access_pipe"
CHANNELANME=`cat /opt/sbin/logs/channel.conf|grep -E -v "^#"|awk '{print $1}'`
IP=`cat /opt/sbin/logs/channel.conf|grep -E -v "^#"|awk '{print $4}'`
if [ ! -r ${PIPE} ]
then
mkfifo $PIPE
fi
cut_log (){
cd $LOGPATH
${CRONLOG} ${CHANNELANME}_${IP}_%Y.%m.%d_%HH_log < $PIPE &
}
stop_cut (){
ps axww|grep ${CRONLOG}|awk '{print $1}'|kill -9
}
start_nginx(){
$NGINX_PATH ;
}
reload_nginx(){
$NGINX_PATH -s reload;
}
stop_nginx(){
$NGINX_PATH -s stop;
}
case $1 in
start)
cut_log
start_nginx
;;
reload)
reload_nginx
;;
stop)
stop_nginx
stop_cut
;;
stopcut)
stop_cut
;;
startcut)
cut_log
;;
*)
echo 'please input keyword "start|stop|reload|stopcut|startcut"!'
exit 1;
;;
esac
这里需要创建一个/opt/sbin/logs/channel.conf文件,并在文件记录类似下面内容:
test.test.com 2345 nginx 127.0.0.1
附录:
mkfifo命令介绍
NAME(名称)
mkfifo - 创建FIFO(命名管道)
SYNOPSIS(总览)
mkfifo [options] file...
POSIX options(选项): [-m mode]
GNU options(选项)(最短格式): [-m mode] [--help] [--version] [--]
DESCRIPTION(描述)
mkfifo 使用指定的文件名创建FIFO(也称为"命名管道").
"FIFO"是一种特殊的文件类型,它允许独立的进程通讯. 一个进程打开FIFO文件进行写操作,而另一个进程对之进行读操作, 然后数据便可以如同在shell或者其它地方常见的的匿名管道一样流线执行.
默认情况下,创建的FIFO的模式为0666('a+rw')减去umask中设置的位.
OPTIONS(选项)
- -m mode, --mode=mode
- 设置创建的FIFO的模式为 mode, 这可以是 (1) 中的符号模式,并使用默认模式作为起始点.
GNU STANDARD OPTIONS(GNU标准选项)
- --help
- 在标准输出上打印一条用法信息,并以成功状态退出.
- --version
- 在标准输出上打印版本信息,然后以成功状态退出.
- --
- 终止选项列表.
ENVIRONMENT(环境变量)
变量LANG, LC_ALL, LC_CTYPE和LC_MESSAGES取其常用义.
CONFORMING TO(遵循规则)
POSIX 1003.2
阅读(2572) | 评论(0) | 转发(0) |