天天看點

用Shell寫一個日志收集腳本

有時候想了想Flume架構的原理,其實也是對檔案或者檔案夾進行監控,那我自己也可以寫一個腳本來簡單的實作監控我們想監控的檔案,然後對其進行上傳。

1. 引入環境變量

#!/bin/bash

#set java env
export JAVA_HOME=/home/fantj/jdk/
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH

#set hadoop env
export HADOOP_HOME=/home/fantj/hadoop/
export PATH=${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:$PATH
           

2. 聲明路徑變量

#日志檔案存放的目錄
log_src_dir=/home/fantj/log/

#待上傳檔案存放的目錄
log_toupload_dir=/home/fantj/toupload/


#日志檔案上傳到hdfs的根路徑
hdfs_root_dir=/data/log/
           

3. 掃描檔案

ls $log_src_dir | while read fileName
do
        if [[ "$fileName" == access.log ]]; then
                date=`date +%Y_%m_%d_%H_%M_%S`
                #将檔案移動到待上傳目錄并重命名
                #列印資訊
                echo "moving $log_src_dir$fileName to $log_toupload_dir"fantj_log_$fileName"$date"
                mv $log_src_dir$fileName $log_toupload_dir"fantj_log_$fileName"$date
                #将待上傳的檔案path寫入一個清單檔案willDoing
                echo $log_toupload_dir"fantj_log_$fileName"$date >> $log_toupload_dir"willDoing."$date
        fi

done
           

把已經掃描到的日志檔案重命名,然後mv到待上傳目錄,然後列印日志,并對mv成功的日志檔案加上willDoing做未完成上傳标記。

4. 開始上傳

#找到清單檔案willDoing
ls $log_toupload_dir | grep will |grep -v "_COPY_" | grep -v "_DONE_" | while read line
do
        #列印資訊
        echo "toupload is in file:"$line
        #将待上傳檔案清單willDoing改名為willDoing_COPY_
        mv $log_toupload_dir$line $log_toupload_dir$line"_COPY_"
        #讀清單檔案willDoing_COPY_的内容(一個一個的待上傳檔案名)  ,此處的line 就是清單中的一個待上傳檔案的path
        cat $log_toupload_dir$line"_COPY_" |while read line
        do
                #列印資訊
                echo "puting...$line to hdfs path.....$hdfs_root_dir"
                hadoop fs -put $line $hdfs_root_dir
        done
        mv $log_toupload_dir$line"_COPY_"  $log_toupload_dir$line"_DONE_"
done
           

5. 測試

我在

/home/fantj/log

目錄下放一個

access.log

檔案,然後執行腳本。

[root@s166 fantj]# ./upload2hdfs.sh

envs: hadoop_home: /home/fantj/hadoop/
log_src_dir:/home/fantj/log/
moving /home/fantj/log/access.log to /home/fantj/toupload/fantj_log_access.log2018_07_29_12_49_03
toupload is in file:willDoing.2018_07_29_12_49_03
puting.../home/fantj/toupload/fantj_log_access.log2018_07_29_12_49_03 to hdfs path...../data/log/
           
[root@s166 fantj]# hadoop fs -ls -R /data/
drwxr-xr-x   - root supergroup          0 2018-07-29 00:49 /data/log
-rw-r--r--   3 root supergroup      14340 2018-07-29 00:49 /data/log/fantj_log_access.log2018_07_29_12_49_03
-rw-r--r--   3 root supergroup      14340 2018-07-28 13:53