该脚本的功能是定时分割日志文件

#!/usr/bin/env bash

#定时分割清理日志文件

#usage="Usage: logrotate (start|stop) file (line|size)"
#usage="-e Usage: logrotate start file (line|size) or logrotate stop"
usage="-e Usage: ${PROGRAM} { start file (line|size) | stop | restart file (line|size) | status | version | help }" #获取该文件的名称
declare -r PROGRAM="$(basename "$")" #解析参数
# get arguments
startStop=$
shift
logfile=$
shift
lineSize=$
shift
#echo $startStop
#echo "logfile: $logfile" #设置心跳,即多长时间执行一次,单位s
HEARTBEAT=${HEARTBEAT:-$[**]}
#HEARTBEAT=
#echo $HEARTBEAT #日志保存天数
SAVE_DAYS=${SAVE_DAYS:-} function get_time(){
#获取今天日期
TODAY_DATE=$(date +%Y%m%d)
#echo $TODAY_DATE #获取 $SAVE_DAYS 天前的日期
#EARLY_DATE=`date +%Y%m%d --date="-1 day"`
EARLY_DATE=$(date +%Y%m%d --date="-${SAVE_DAYS} day")
#echo $EARLY_DATE #获取当前时间
cur_time=$(date "+%Y%m%d%H%M%S")
} #清理过期日志文件
function delete_expired_logfile() {
logfileLength=`echo ${FILEPrefix} |wc -L`
let logfileLength=$logfileLength+
#echo $logfileLength #遍历符合表达式的文件
for logfiles in `ls ${FILEDIR} | grep -o -E ${FILEPrefix}_'[0-9]*'_'[0-9]*'.log`
do
#echo $logfiles
logfileLength2=`echo ${logfiles} |wc -L`
#如果文件长度等于规定的长度,
if [ $logfileLength2 -eq $logfileLength ] ; then
#获取该日志文件的日期
logDate=${logfiles::}
if [ $logDate -lt $EARLY_DATE ] ; then
rm -rf ${FILEDIR}/$logfiles
fi
fi
done
} #获取日志目录与日志名
function get_logname_info() {
#logfile=/home/user/file/out.log
#已知文件,获取文件名,该方式是从左开始最大化匹配到字符"/",然后截掉左边内容(包括字符"/"),返回余下右侧部分。
FILENAME=${logfile##*/}
#echo "filename: $FILENAME" #判断$logfile是否包含"/"
#echo "$logfile" |grep -q "/"
#if [ $? -eq 0 ] ; then
if [[ $logfile =~ "/" ]] ; then
#已知文件,获取文件路径,该方式是从右开始第一次匹配到字符"/",然后截掉右边内容(包括字符"/"),返回余下左侧部分。
FILEDIR=${logfile%/*}
else
FILEDIR="."
fi #echo "filedir: $FILEDIR" #获取文件名前缀
FILEPrefix=${FILENAME%.*}
#echo "filePrefix: $FILEPrefix" #判断$FILENAME是否包含"."
if [[ $FILENAME =~ "." ]] ; then
#获取文件名后缀
FILESuffix=${FILENAME##*.}
else
FILESuffix=""
fi
#echo "fileSuffix: $FILESuffix" #LOG_DIR="/usr/local/nginx/logs/"
#echo $LOG_DIR
} ###################################
#(函数)判断程序是否已启动
#
#说明:
#使用JDK自带的JPS命令及grep命令组合,准确查找pid
#jps 加 l 参数,表示显示java的完整包路径
#使用awk,分割出pid ($1部分),及Java程序名称($2部分)
###################################
#初始化psid变量(全局)
psid=0 function checkpid() {
javaps=`ps -ef | grep $PROGRAM | grep -v "grep"` if [ -n "$javaps" ]; then
psid=`echo $javaps | awk '{print $2}'`
else
psid=0
fi
} ###################################
#(函数)启动程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示程序已启动
#3. 如果程序没有被启动,则执行启动命令行
#4. 启动命令执行后,再次调用checkpid函数
#5. 如果步骤4的结果能够确认程序的pid,则打印[OK],否则打印[Failed]
#注意:echo -n 表示打印字符后,不换行
#注意: "nohup 某命令 >/dev/null 2>&1 &" 的用法
###################################
function do_start() {
echo -n "Starting $PROGRAM ..."
checkpid
echo -n "(pid=$psid) "
if [ $psid -ne 0 ]; then
echo "[OK]"
if [[ $lineSize == "line" ]] || [[ $lineSize == "size" ]] ; then
while true
do
get_time
delete_expired_logfile
case "${lineSize:-}" in
line)
#divide_file_by_line
divide_file_by_line2
;; size)
divide_file_by_size
;; esac sleep ${HEARTBEAT}
done
else
echo "Usage: logrotate start file (line|size)"
fi
else
echo "[Failed]"
fi
} ###################################
#(函数)停止程序
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则开始执行停止,否则,提示程序未运行
#3. 使用kill -9 pid命令进行强制杀死进程
#4. 执行kill命令行紧接其后,马上查看上一句命令的返回值: $?
#5. 如果步骤4的结果$?等于0,则打印[OK],否则打印[Failed]
#6. 为了防止java程序被启动多次,这里增加反复检查进程,反复杀死的处理(递归调用stop)。
#注意:echo -n 表示打印字符后,不换行
#注意: 在shell编程中,"$?" 表示上一句命令或者一个函数的返回值
###################################
function do_stop() {
checkpid if [ $psid -ne 0 ]; then
echo -n "Stopping $PROGRAM ...(pid=$psid) "
kill -9 $psid
if [ $? -eq 0 ]; then
echo "[OK]"
else
echo "[Failed]"
fi checkpid
if [ $psid -ne 0 ]; then
stop
fi
else
echo "================================"
echo "warn: $PROGRAM is not running"
echo "================================"
fi
} #copy文件
function copy_logfile() {
logfile_bak=${logfile}.bak
#echo ${logfile_bak}
cp -rf $logfile ${logfile_bak}
#filename_bak=${FILENAME}.bak
#echo ${FILENAME}
#echo ${filename_bak}
#cp -rf ${FILEDIR}/${FILENAME} ${FILEDIR}/${filename_bak}
} #设置划分文件的行数
LINE_NUM=${LINE_NUM:-30000}
#LINE_NUM=${LINE_NUM:-3}
#echo $LINE_NUM
#按照固定行数分割文件
function divide_file_by_line() {
#get_time #获取日志文件的行数
#line=`cat $logfile | wc -l`
line=`sed -n '$=' $logfile`
#echo $line
startLine=1
#endLine=$line
i=0
# 如果line > LINE_NUM,则进行划分, (-gt > , -lt <, )
#while [ ${endLine} -gt 0 ]
while [ ${startLine} -lt ${line} ]
do
#startLine=1
let endLine=$startLine+$LINE_NUM-1
num=`printf "%04d\n" $i` #sed -n "${startLine},${endLine} p;q" $logfile >result_${cur_time}.txt
#将 $logfile 文件的从${startLine}到${LINE_NUM}行的数据写到 文件
#sed -n "${startLine},${LINE_NUM} p" $logfile >${FILEPrefix}_${cur_time}_${num}.log
sed -n "${startLine},${endLine} p" $logfile >${FILEDIR}/${FILEPrefix}_${cur_time}_${num}.log
#删除指定的行
#sed -i "${startLine},${LINE_NUM} d" $logfile
#let endLine=${endLine}-${LINE_NUM}
let startLine=$startLine+$LINE_NUM
let i=$i+1
#sleep 1s
done
#清空文件内容,因为日志文件实时更新,所以不能清空
#echo "" > $logfile
#删除指定的行
sed -i "1,${line} d" $logfile
} #按照固定行数分割文件
function divide_file_by_line2() {
#get_time #获取日志文件的行数
line=`cat $logfile | wc -l`
#line=`sed -n '$=' $logfile` # 以行为单位划分文件,-l行数,将urls.txt文件按2000行一个文件分割为多个文件;-d添加数字后缀,比如00,01,02;-a 2表示用两位数据来顺序命名;url_定义分割后的文件名前缀。
# split urls.txt -l 2000 -d -a 2 url_
split $logfile -l ${LINE_NUM} -d -a 4 "${FILEDIR}/${FILEPrefix}_${cur_time}_"
#ls|grep tmp_|xargs -n1 -i{} mv {} {}.txt,意思是先查找tmp_开头的文件,然后逐个重命名为.txt
ls ${FILEDIR} |grep "${FILEPrefix}_${cur_time}_"|xargs -n1 -i{} mv ${FILEDIR}/{} ${FILEDIR}/{}.log
#rename_logfile #清空文件内容,因为日志文件实时更新,所以不能清空
#echo "" > $logfile
#删除指定的行
sed -i "1,${line} d" $logfile
} #设置划分文件的大小(单位MB)(1MB=1*1024KB=1*1024*1024B=1*1024*1024*8b)
#转换成KB
#SIZE=${SIZE:-$[32*1024]}
SIZE=${SIZE:-32}
#SIZE=5
#echo $SIZE
#按照文件大小,分割文件
function divide_file_by_size() {
#get_time #获取日志文件的行数
line=`cat ${logfile} | wc -l` #按文件大小划分
# 以文件大小为单位划分文件,-b, --bytes=SIZE:对file进行切分,每个小文件大小为SIZE,可以指定单位b,k,m;-d添加数字后缀,比如00,01,02;-a 2表示用两位数据来顺序命名;url_定义分割后的文件名前缀。
# split urls.txt -b 500k -d -a 2 url_
split $logfile -b ${SIZE}m -d -a 4 "${FILEDIR}/${FILEPrefix}_${cur_time}_"
#ls|grep tmp_|xargs -n1 -i{} mv {} {}.txt,意思是先查找tmp_开头的文件,然后逐个重命名为.txt
ls ${FILEDIR}|grep "${FILEPrefix}_${cur_time}_"|xargs -n1 -i{} mv ${FILEDIR}/{} ${FILEDIR}/{}.log
#rename_logfile #删除指定的行
sed -i "1,${line} d" $logfile
} #重命名日志文件
function rename_logfile() {
#加.log后缀
for logfiles in `ls ${FILEDIR} | grep "${FILEPrefix}_${cur_time}_"`
do
# 拼接成文件名
logfilename="${logfiles}.log"
# 更改文件名
mv ${FILEDIR}/$logfiles ${FILEDIR}/$logfilename
done
} function do_version() {
echo "$PROGRAM version \"1.0\""
} ###################################
#(函数)检查程序运行状态
#
#说明:
#1. 首先调用checkpid函数,刷新$psid全局变量
#2. 如果程序已经启动($psid不等于0),则提示正在运行并表示出pid
#3. 否则,提示程序未运行
###################################
status() {
checkpid if [ $psid -ne 0 ]; then
echo "$PROGRAM is running! (pid=$psid)"
else
echo "$PROGRAM is not running"
fi
} #主函数
function main() {
get_logname_info case "${startStop:-}" in
start)
if [ ${logfile:-} ] ; then
do_start
else
echo "Usage: logrotate start file (line|size)"
fi
;; stop)
do_stop
;; restart)
do_stop
if [ ${logfile:-} ] ; then
do_start
else
echo "Usage: logrotate restart file (line|size)"
fi
;; status)
do_status
;; version|--version|-v)
do_version
;; help|--help|-help)
echo $usage #"Usage: ${PROGRAM} { start | stop | restart | status | version | help }"
;; *)
echo >&2 $usage #"Usage: ${PROGRAM} { start | stop | restart | status | version | help }"
exit 1
;;
esac
} #运行
main "$@"

Linux日志分割脚本的更多相关文章

  1. 【运维实战】一次linux日志分割之路——将日志按照每小时进行分割,并按照“日期-小时”格式保存

    是这样的,现在需要对nginx的access.log进行按照每小时进行分割,并且最好还要能够以 “日期+时间”的形式,命名保存. 两点,一个是按照每小时进行分割,一个是将日志以“日期+时间”的形式进行 ...

  2. linux日志分割、去重、统计

    一.实例 单条日志模板: 2018-11-08 02:17:22 [Iceberg]process params:IcebergOfferServiceImpl.Params(pk=BF06NA2YE ...

  3. nginx日志分割脚本

    [root@localhost nginx]# cat logs/nginx.pid 5118[root@localhost nginx]# kill -QUIT 5118-QUIT : 关闭进程-H ...

  4. Linux 日志分析脚本

    #### 以下代码,若出现无法使用,请根据底下图片,更改参数.根据 apache 日志格式修改 查看 apache 进程ps aux | grep httpd | grep -v grep | wc ...

  5. Linux 日志切割方法总结--Logrotate

    一.Logrotate 使用方法 对于Linux系统安全来说,日志文件是极其重要的工具.logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到&qu ...

  6. Nginx高性能服务器安装、配置、运维 (6) —— Nginx日志及日志分割

    七.Nginx日志及日志分割 (1)Nginx日志文件 查看Nginx配置文件: 找到access_log,yum安装默认存储在/var/log/nginx目录下,且默认main格式: main格式定 ...

  7. Linux日志文件分割

    经常有这样的情况,日志文件或者数据文件会变得很庞大,那么每次对这些目标文件的访问或者修改就会变得极其耗时.因而引发一些性能问题,但是如果对这些目标文件进行分割,限定其大小,那么每次的访问或者修改就会变 ...

  8. linux文件分割(将大的日志文件分割成小的)

    linux文件分割(将大的日志文件分割成小的) linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两种模式.Linux下文件合并可以通过cat命令来实现,非常简单. 在L ...

  9. linux文件分割(将大的日志文件分割成小的)【转载】

    linux文件分割(将大的日志文件分割成小的)linux下文件分割可以通过split命令来实现,可以指定按行数分割和安大小分割两种模式.Linux下文件合并可以通过cat命令来实现,非常简单. 在Li ...

随机推荐

  1. 使用 kexec 快速重启 Linux

    http://www.ibm.com/developerworks/cn/linux/l-kexec/ 简介: 即使您的工作不要求您每天多次重新启动您的 Linux 机器,等待系统启动也实在是一件枯燥 ...

  2. UVa11234 表达式

    题意:题目意思是给出后缀表达式.能够通过栈来计算表达式的值,即转化为中缀表达式. 然后如果如今不用栈.而是用队列来操作.即每遇到一操作符时.进行两次pop和一次push.(这里注意,先pop出来的作为 ...

  3. POJ 3469(Dual Core CPU-最小割)[Template:网络流dinic V2]

    Language: Default Dual Core CPU Time Limit: 15000MS   Memory Limit: 131072K Total Submissions: 19321 ...

  4. krpano HTML5 Viewer可以实现全景展示

    http://www.krpano360.com/ krpanp 陀螺仪调取 全景展示

  5. Java中的class类的cast方法和asSubclass方法

    一般来说cast是转型的意思,但是学java的时间也不短了,class类居然还有cast这个方法,这里来学习一下这个cast有何用. 第一次看到这个cast是在Spring的源码中, spring-f ...

  6. mac osx 下编译 OpenWrt

    默认的文件系统hfs大小写不敏感.新建一个磁盘镜像文件并合式化为hfs+, 然后挂载到系统中. hdiutil create -size 20g -fs "Case-sensitive HF ...

  7. windows常用命令(转载)

    1.最基本,最常用的,测试物理网络的  ping 192.168.0.8 -t ,参数-t是等待用户去中断测试 2.查看DNS.IP.Mac等  A.Win98:winipcfg  B.Win2000 ...

  8. 在XP上安装VS2002

    在2002 年,随着 .NET 口号的提出与 Windows XP/Office XP 的公布,微软公布了 Visual Studio .NET(内部版本为 7.0). 使用VS2002+Object ...

  9. GCJ Qualification Round 2016 C题

    题意是给定了一个叫“jamcoin”的定义,让你生成足够数量满足条件的jamcoin. jamcoin其实就可以理解成一个二进制整数,题目要求的要么长度为16位,要么为32位,一头一尾两个位必须是1, ...

  10. 2017NOIP游记 (格式有点炸)

    NOIP游记 作者:一只小蒟蒻 时间可真快呀!还记得我第一次接触信息竞赛时,hello world都要调好久,不知不觉就考完了2017noip,自我感觉良好(虽然还是有很多不足). 这两个月的闭关,让 ...