多项目百库百表慢日志切割

问题描述:

    多个项目,有些项目分库分表分布在多个节点,因此,对慢日志的切割并且收集对于慢日志分析来说是极其必要的。

实现方案:

    ①环境准备

    Host1 : ftp服务器(192.168.xx.xxx),用于集中存储各项目每天(可脚本自定义)的日志
    Host2 : mysql服务器(192.168.xx.xxx),用于存储配置相关的参数(如需要收集的日志host,user,pwd,日志位置等信息),之后用于脚本的查询调用。
    Host3 : 执行操作的机器(192.168.xx.xxx) ,即执行脚本设置定时任务的机器

    ②脚本准备

    涉及到两个脚本,logrotate.sh 以及 job.sh
    其中job.sh用于批量执行的mysql中存储的相关host的操作,job.sh调用logrotate.sh
    logrotate.sh用于在各台需要收集日志的机器上实际的执行操作

    mysql配置表结构及数据如下(注意添加一个所有机器都能查询该表的一个账号):

create table t_log_info(
`id` int( 11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
game     varchar(20) NOT NULL  ,
host_ip  varchar(20) NOT NULL ,
old_dir  varchar(20) NOT NULL DEFAULT '/home' ,
slow_log varchar(20) NOT NULL ,
ftp_host varchar(20) NOT NULL ,
ftp_user varchar(20) NOT NULL ,
ssh_user varchar(20) NOT NULL ,
ssh_pwd  varchar(20) NOT NULL ,
PRIMARY KEY ( `id`));


    

    


    job.sh脚本如下:
    

点击(此处)折叠或打开

  1. #!/bin/bash
  2.  
  3.  
  4. mysql_host=192.168.xx.xxx
  5. mysql_port=3456
  6. mysql_user=xxx
  7. mysql_pwd=xxxxxx
  8.  
  9.  
  10. function get_info {
  11.     cmd=`which mysql`
  12.     $cmd -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_pwd -BNe "select * from DB_SPLIT_LOG.t_log_info;" | while read line
  13.     do
  14.         host_ip=`echo $line | awk '{print $3}'`
  15.         ssh_user=`echo $line | awk '{print $9}'`
  16.         ssh_pwd=`echo $line | awk '{print $10}'`
  17.         /usr/bin/sshpass -p $ssh_pwd ssh -o StrictHostKeyChecking=no $ssh_user@$host_ip "bash " < logrotate.sh
  18.     done
  19. }
  20.  
  21. get_info


    logrotate.sh脚本内容如下:

点击(此处)折叠或打开

  1. #!/bin/bash
  2.  
  3.  
  4. declare game
  5. declare slow_log
  6. declare ftp_host
  7. declare ftp_user
  8. declare ftp_pwd
  9. declare ssh_pwd
  10. declare local_ip
  11. declare log_name
  12. declare old_dir
  13. declare tmp_conf
  14. declare tran_log_dir
  15. declare tran_log
  16.  
  17. dev=eth1
  18. mysql_host=192.168.xx.xxx
  19. mysql_port=3456
  20. mysql_user=xxx
  21. mysql_pwd=xxxxx
  22. mysql_db=DB_SPLIT_LOG
  23.  
  24. date=`date +%Y%m%d`
  25.  
  26.  
  27.  
  28. function get_ip {
  29.     local_ip=`/sbin/ifconfig| grep -A 1 "$dev" | grep -i 'inet addr' | head -1 | awk -F[:] '{print $2}' | cut -d' ' -f1`
  30. }
  31.  
  32. function get_info {
  33.     cmd=`which mysql`
  34.     argvs=`$cmd -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_pwd -BNe "select * from DB_SPLIT_LOG.t_log_info where host_ip='${local_ip}' limit 1;"`
  35.     game=`echo $argvs | awk '{print $2}'`
  36.     local_ip=`echo $argvs | awk '{print $3}'`
  37.     old_dir=`echo $argvs | awk '{print $4}'`
  38.     slow_log=`echo $argvs | awk '{print $5}'`
  39.     ftp_host=`echo $argvs | awk '{print $6}'`
  40.     ftp_user=`echo $argvs | awk '{print $7}'`
  41.     ftp_pwd=`echo $argvs | awk '{print $8}'`
  42.  
  43.  
  44.     log_name=${game}_`date +%Y%m%d`_$local_ip.slow
  45.     tmp_conf=$old_dir/logrotate_${date}.conf
  46.     mkdir -p /tmp/slow_tran_log
  47.     tran_log_dir=/tmp/slow_tran_log
  48.     tran_log=$tran_log_dir/${date}.log
  49. }
  50.  
  51.  
  52. function operation_log {
  53.     exec 1>$tran_log
  54.     exec 2>$tran_log
  55. }
  56.  
  57. function create_rotate_conf {
  58.     echo """
  59.     $slow_log {
  60.         daily
  61.         copytruncate
  62.         dateext
  63.         create 0660 mysql mysql
  64.         olddir $old_dir
  65.         rotate 1
  66.     }
  67.     """ > $tmp_conf
  68. }
  69.  
  70.  
  71. function start_logrotate {
  72.     echo ""
  73.     /usr/sbin/logrotate -vf $tmp_conf
  74. }
  75.  
  76.  
  77. function change_logname {
  78.     echo ""
  79.  
  80.     for file in `find $old_dir -maxdepth 1 -type f -name "*slow*${date}*"`
  81.     do
  82.         echo $file
  83.     done
  84.     echo "change log name $file to ${old_dir}/${log_name}"
  85.     mv $file ${old_dir}/${log_name}
  86. }
  87.  
  88. function ftp_put {
  89.     echo ""
  90.     echo "start ftp put $log_name"
  91.     ftp -in <<EOF
  92.     open $ftp_host
  93.     user $ftp_user $ftp_pwd
  94.     mkdir $game
  95.     cd $game
  96.     lcd $old_dir
  97.     mput $log_name
  98.     quit
  99. EOF
  100.     echo "ftp put $log_name over!"
  101. }
  102.  
  103. function clear_tmp_file {
  104.     echo ""
  105.     echo "clear tmp file"
  106.     cd $old_dir
  107.     echo "cd $old_dir "
  108.     echo "rm -f $tmp_conf "
  109.     echo "rm -f $log_name "
  110.     rm -f $tmp_conf
  111.     rm -f $log_name
  112. }
  113.  
  114. get_ip
  115. get_info
  116. operation_log
  117. create_rotate_conf
  118. start_logrotate
  119. change_logname
  120. ftp_put
  121. clear_tmp_file

        在Host3上将两个脚本置于一个目录之下,然后添加一个定时任务

        

        
        在Host2(ftp)上查看操作结果
        
        


       ③过程描述
        1 .  job.sh 查询DB_SPLIT_LOG.t_log_info表中的所有host_ip ssh_user ssh_pwd ,然后循环远程执行脚本logrotate.sh
        2 . logrotate.sh 首先查询本机ip ,然后根据本机ip获取DB_SPLIT_LOG.t_log_info表中对应的log_dir lot_file game ftp相关信息
        3 . 生成logrotate的配置文件
        4 . 进行切割
        5 . 更改切割出来的日志名称
        6 . 上传到ftp
        7 . 清空临时文件
    
    注意点:logrotate所切割的文件产生的结果必须和源文件在一个分区上(即你切割的结果文件slow.log-2016-10-25和原来的slow.log文件),不然切割会不成功。

    另 : 该脚本适用于任何日志文件的切割与收集。只需要在DB_SPLIT_LOG.t_log_info表中添加相应的记录即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值