由于项目需求,需要将玩家信息从日志中存入到DB中,DB暂选MySQL.

    本文并未使用开源的向fluentd  http://fluentd.org/doc/overview.html一样的系统,我的工作只是日志分析,存入DB,剩下的是开发人员如何展示数据啦。现列出部分脚本,欢迎各位提出意见:

    日志收集脚本(用shell搞定),核心思想是scp,并用cat 合并文件。

    此程序分3个目录,bin目录下可执行脚本collect_log.sh  expect_rsync.sh

    conf 目录,service_server  sync_file  web_server  三个文件存储ip,和文件名称

    data目录 存储收集、合并结果

    expect_rsync.sh  远程传输:

     #!/usr/bin/expect -f

    set host [lindex $argv 0]
    set remote_dir [lindex $argv 1]
    set file [lindex $argv 2]
    set local_dir [lindex $argv 3]
    spawn scp "xxxxxx@$host#36000:$remote_dir/$file" $local_dir
    expect {
        -re "assword:" {
            send "xxxxxx\r"
        } -re "Permission denied, please try again." {
            exit
        } -re "Connection refused" {
            exit
        } timeout {
            exit
        } eof {
            exit
        }
    }
    expect eof
    exit

   collect_log.sh 判断机器和文件名

#!/bin/bash
WEB_REMOTE_DIR=/data/matrixjoyweb/matrixjoy-dragon-web/logs
SERVICE_REMOTE_DIR=/data/matrixjoyservice/matrixjoy-dragon-gameserver/logs/
SCDIR=/data/log-system/
RAWDATADIR=$SCDIR/data/raw/
LOGDATE=$(date  +%Y%m%d --date="-$1 day")

#transport function
function expect_rsync_logs() {
        /usr/bin/expect -f $SCDIR/bin/expect_rsync.sh $@
}

#mkdir directory
function ensure_dir() {
        if [ ! -d $1 ]
        then
                mkdir -p $1
        fi
}

function  collect() {
        server_list=$1
        remote_dir=$2
        dirtype=$3

        for serverip in $server_list
        do
                store_dir="$RAWDATADIR/$serverip/$dirtype/$LOGDATE"
                ensure_dir  $store_dir  
                for file in $(cat $SCDIR/conf/sync_file)
                do
                        file_name=$file$LOGDATE
                        #Call the funciton to sync file
                        expect_rsync_logs $serverip  $remote_dir $file_name  $store_dir

                done

        done
}

function main() {
        source /etc/profile
        ensure_dir $RAWDATADIR
        IFS="
"
        collect  $(cat $SCDIR/conf/service_server) $SERVICE_REMOTE_DIR service
        collect  $(cat $SCDIR/conf/web_server) $WEB_REMOTE_DIR web
}


#merge log 

function merge() {
        TARGET="$SCDIR/data/total/$LOGDATE"
        server_ip_list=$1
        dir_type=$2
        echo $TARGET
        ensure_dir $TARGET
        for file in $(cat $SCDIR/conf/sync_file)
        do
                file_name=$file$LOGDATE
                for ip in $server_ip_list
                do
                srcdir="$RAWDATADIR/$ip/$dir_type/$LOGDATE"
                cat "$srcdir/$file_name" >> "$TARGET/$file_name"
                done
        done

}

function merge_result() {
        ensure_dir $TARGET
        IFS="
"
        merge $(cat $SCDIR/conf/service_server) service
        merge $(cat $SCDIR/conf/web_server) web 
}

main
merge_result 

     待续。。。