千家信息网

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

发表于:2024-11-19 作者:千家信息网编辑
千家信息网最后更新 2024年11月19日,问题描述:多个项目,有些项目分库分表分布在多个节点,因此,对慢日志的切割并且收集对于慢日志分析来说是极其必要的。实现方案:①环境准备Host1 : ftp服务器(192.168.xx.xxx),用于集
千家信息网最后更新 2024年11月19日多项目百库百表慢日志切割问题描述:

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

实现方案:

①环境准备

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配置表结构及数据如下(注意添加一个所有机器都能查询该表的一个账号):






job.sh脚本如下:

点击(此处)折叠或打开

  1. #!/bin/bash


  2. mysql_host=192.168.xx.xxx
  3. mysql_port=3456
  4. mysql_user=xxx
  5. mysql_pwd=xxxxxx


  6. function get_info {
  7. cmd=`which mysql`
  8. $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
  9. do
  10. host_ip=`echo $line | awk '{print $3}'`
  11. ssh_user=`echo $line | awk '{print $9}'`
  12. ssh_pwd=`echo $line | awk '{print $10}'`
  13. /usr/bin/sshpass -p $ssh_pwd ssh -o StrictHostKeyChecking=no $ssh_user@$host_ip "bash " < logrotate.sh
  14. done
  15. }

  16. get_info

logrotate.sh脚本内容如下:

点击(此处)折叠或打开

  1. #!/bin/bash


  2. declare game
  3. declare slow_log
  4. declare ftp_host
  5. declare ftp_user
  6. declare ftp_pwd
  7. declare ssh_pwd
  8. declare local_ip
  9. declare log_name
  10. declare old_dir
  11. declare tmp_conf
  12. declare tran_log_dir
  13. declare tran_log

  14. dev=eth2
  15. mysql_host=192.168.xx.xxx
  16. mysql_port=3456
  17. mysql_user=xxx
  18. mysql_pwd=xxxxx
  19. mysql_db=DB_SPLIT_LOG

  20. date=`date +%Y%m%d`



  21. function get_ip {
  22. local_ip=`/sbin/ifconfig| grep -A 1 "$dev" | grep -i 'inet addr' | head -1 | awk -F[:] '{print $2}' | cut -d' ' -f1`
  23. }

  24. function get_info {
  25. cmd=`which mysql`
  26. 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;"`
  27. game=`echo $argvs | awk '{print $2}'`
  28. local_ip=`echo $argvs | awk '{print $3}'`
  29. old_dir=`echo $argvs | awk '{print $4}'`
  30. slow_log=`echo $argvs | awk '{print $5}'`
  31. ftp_host=`echo $argvs | awk '{print $6}'`
  32. ftp_user=`echo $argvs | awk '{print $7}'`
  33. ftp_pwd=`echo $argvs | awk '{print $8}'`


  34. log_name=${game}_`date +%Y%m%d`_$local_ip.slow
  35. tmp_conf=$old_dir/logrotate_${date}.conf
  36. mkdir -p /tmp/slow_tran_log
  37. tran_log_dir=/tmp/slow_tran_log
  38. tran_log=$tran_log_dir/${date}.log
  39. }


  40. function operation_log {
  41. exec 1>$tran_log
  42. exec 2>$tran_log
  43. }

  44. function create_rotate_conf {
  45. echo """
  46. $slow_log {
  47. daily
  48. copytruncate
  49. dateext
  50. create 0660 mysql mysql
  51. olddir $old_dir
  52. rotate 1
  53. }
  54. """ > $tmp_conf
  55. }


  56. function start_logrotate {
  57. echo ""
  58. /usr/sbin/logrotate -vf $tmp_conf
  59. }


  60. function change_logname {
  61. echo ""

  62. for file in `find $old_dir -maxdepth 1 -type f -name "*slow*${date}*"`
  63. do
  64. echo $file
  65. done
  66. echo "change log name $file to ${old_dir}/${log_name}"
  67. mv $file ${old_dir}/${log_name}
  68. }

  69. function ftp_put {
  70. echo ""
  71. echo "start ftp put $log_name"
  72. ftp -in <<EOF
  73. open $ftp_host
  74. user $ftp_user $ftp_pwd
  75. mkdir $game
  76. cd $game
  77. lcd $old_dir
  78. mput $log_name
  79. quit
  80. EOF
  81. echo "ftp put $log_name over!"
  82. }

  83. function clear_tmp_file {
  84. echo ""
  85. echo "clear tmp file"
  86. cd $old_dir
  87. echo "cd $old_dir "
  88. echo "rm -f $tmp_conf "
  89. echo "rm -f $log_name "
  90. rm -f $tmp_conf
  91. rm -f $log_name
  92. }

  93. get_ip
  94. get_info
  95. operation_log
  96. create_rotate_conf
  97. start_logrotate
  98. change_logname
  99. ftp_put
  100. 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