概述
詳細
一、功能簡介
logview 是一個Shell腳本編寫的基於終端的日志工具, 具有終端通知, email通知, 錯誤信息顏色配置, 以及靈活強大的監控配置. 還可以靈活的配置腳本監控的時間, 以及錯誤發生時需要進行的處理等. 該工具所使用的算法很適合監控大型日志。該工具,居然有如下功能:
-
腳本所采用的算法非常適合用來監視大型日志文件
-
將所監視出的錯誤信息發送給指定的郵件列表
-
可以設置監視頻率,比如30s/1h掃描一次日志文件
-
將錯誤信息發送到指定的tty,達到出現錯誤立即知曉的目的
-
自動指定腳本從何時開始監視日志文件,以及何時結束監視
-
自由指定錯誤發生時,腳本所要執行的操作,比如kill掉產生日志文件的進程等.
-
給錯誤信息配色
-
日志文件分析及生成日志報告的功能
-
可以自由指定所要監控的報錯信息
-
只要你有bash以及mail命令即可運行此工具
二、實現方法
程序開始,global_variables用來定義一些全局變量和默認值,def_colors用來定義顏色
# load global variables global_variables def_colors cat /dev/null > /tmp/logview_password.$$.log
用while來循環解析命令行參數,用shell case語法來判斷不同的參數格式,不同格式不同處理:
### read cli options
# separate groups of short options. replace --foo=bar with --foo bar
while [[ -n $1 ]]; do
case "$1" in
-- )
for arg in "$@"; do
ARGS[${#ARGS[*]}]="$arg"
done
break
;;
--debug )
set -v
DEBUG=0
;;
--*=?* )
ARGS[${#ARGS[*]}]="${1%%=*}"
ARGS[${#ARGS[*]}]="${1#*=}"
;;
--* )
#die "$0: option $1 requires a value"
ARGS[${#ARGS[*]}]="$1"
;;
-* )
for shortarg in $(sed -e 's|.| -&|g' <<< "${1#-}"); do
ARGS[${#ARGS[*]}]="$shortarg"
done
;;
* )
ARGS[${#ARGS[*]}]="$1"
esac
shift
done
set -- "${ARGS[@]}" 為解析后的最終格式:logview -a --mail-time 5h (...),這種格式可以被如下代碼解析並處理:
[ "$DEBUG" -eq 0 ] && echo "DEBUG: ARGS[@]: ${ARGS[@]}"
while [[ -n $1 ]]; do
((args=1))
case "$1" in
-- )
shift && getfilenames "$@" && break
;;
-h | --help )
Usage
exit 0
;;
-a )
getawkfile
exit 0
;;
-m | --mail-list )
requiredarg "$@"
maillist="$2"
;;
--max-record )
requiredarg "$@"
maxrecord=$2
;;
-s | --scan-time )
requiredarg "$@"
delay=$(conv2seconds "$2")
[ "$delay" == "unknow" ] && die "$0: Unavailable time format."
;;
-l | --log-file )
requiredarg "$@"
loglist=$2
;;
-n | --notice )
requiredarg "$@"
notice=$2
;;
--mail-time )
requiredarg "$@"
mail_time=$(conv2seconds "$2")
[ "$mail_time" == "unknow" ] && die "$0: Unavailable time format."
;;
--start-time )
requiredarg "$@"
start_time=$2
;;
--end-time )
requiredarg "$@"
end_time=$2
;;
-r | --report )
requiredarg "$@"
reprot=$2
;;
--format )
requiredarg "$@"
format=$2
;;
--parse )
requiredarg "$@"
parse="$2"
;;
--timeout-start )
requiredarg "$@"
timeout_start=$(conv2seconds "$2")
[ "$timeout_start" == "unknow" ] && die "$0: Unavailable time format."
;;
--timeout-end )
requiredarg "$@"
timeout_end=$(conv2seconds "$2")
[ "$timeout_end" == "unknow" ] && die "$0: Unavailable time format."
;;
--back-color )
requiredarg "$@"
back_color=\${b$2}
;;
--font-color )
requiredarg "$@"
font_color=\${$2}
;;
--font )
requiredarg "$@"
font=\${$2}
;;
-f )
requiredarg "$@"
[ "$2" == "" ] && die "$0: no input file for '-f' option."
awkfile="$2"
;;
-e )
requiredarg "$@"
[ "$2" == "" ] && die "$0: no input file for '-f' option."
errorfile="$2"
;;
-c | --command-message )
requiredarg "$@"
command_message="$2"
;;
-p | --print )
print_colors
exit 0
;;
-v | --version )
echo "$version"
exit 0
;;
-* )
die "$0: unrecognized option '$1'"
;;
*)
getfilenames "$1"
;;
esac
shift $args
done
# Get log file list
[ "$loglist" != "" ] && {
for f in $(cat $loglist|grep -v ^#)
do
#[[ -f $f ]] || die "$0: $f No such file found."
f="$(deal_remote $f)"
FILES[${#FILES[*]}]="$f"
done
}
不同選項,調用不同的函數進行處理,比如:-a,會調用getawkfile函數來生成awk文件。通過調用requiredarg函數來檢查--mail-time這類參數是否提供一個值,如果沒有提供則報錯。如果提供則把,--mail-time的值賦值給maillist變量
-m | --mail-list )
requiredarg "$@"
maillist="$2"
;;
上面是整個腳本最核心處理復雜命令行參數的代碼。接下來是監控腳本的核心代碼:
logview會轉存錯誤信息到一個文件,如果沒有提供該文件,logview會打印監控到的錯誤信息到stdout:
[ -z "$errorfile" ] && notice=no
logview是通過調用tellb函數來通知出錯信息的,如果notice=no,則不通知,如果notice=one,則調用Linux write命令將錯誤信息寫到當前終端,如果notice=all,則logview會調用Linux wall命令將錯誤信息輸出到所有終端。
接下來是監控腳本的核心邏輯:
通過:
while true
do
...
done
來循環的監控文件。
for ((i=0;i<FILENUM;i++))
do
if [ "$(eval echo '$COUNT'$i)" = "" ];then
[ -f "${MONFILES[i]}" ] &&
eval BASE$i=$(wc -l ${MONFILES[i]} 2>/dev/null| awk '{print $1}') ||
eval BASE$i=0
fi
done
該代碼塊功能主要是循環所有的待監控文件,並做處理。
下面的代碼主要功能是:
-
記住上次掃描的行數
-
計算:下次掃描時用文件總行數 - 上次掃描的函數 = 這次需要掃描的行數。開始掃描行為上次掃描的最后一行的行number。
-
調用awk腳本來判斷當前行是否是錯誤信息。
代碼會調用tail -$LINES ${MONFILES[i]}| eval "$GrepAwk"來執行指定的awk腳本,通過awk腳本判斷當前行是否滿足awk編寫的規則。
for ((i=0;i<FILENUM;i++))
do
sync_file "${MONFILES[i]}" #KONG
[ -f "${MONFILES[i]}" ] &&
eval COUNT$i=$(wc -l ${MONFILES[i]} | awk '{print $1}') ||
eval COUNT$i=0
#eval declare -i comp$i=0
comp=$(($(eval echo '$COUNT'$i) - $(eval echo '$BASE'$i)))
if [ $comp -gt 0 ];then
LINES=$(eval expr '$COUNT'$i - '$BASE'$i)
eval BASE$i='$COUNT'$i
IFS=$'\n'
for MSGS in $(tail -$LINES ${MONFILES[i]}| eval "$GrepAwk")
do
[ $DEBUG -eq 0 ] && echo "DEBUG: \"error\" message is: [$MSGS]"
[ -n "$MSGS" ] && {
deal "$MSGS" "${MONFILES[i]}"
tellb
}
done
fi
done
三、安裝方法
1、准備工作
1. 1台Linux服務器
2、安裝步驟
1. 解壓logview.zip包
unzip logview.zip
2. 進入logview目錄
cd logview
3. 復制logview文件到你的$PATH路徑中
3、使用方法
1. 獲取awk過濾文件,腳本用該文件過濾錯誤信息,如果僅想過濾帶error/failed的行,你可以執行:
logview -a
該命令會在當前目錄生成名為awk.example的文件,你可以在該文件的基礎上進行修改
2. 運行./logview腳本
./logview awk.example -f test.log
3. 更多使用方法,執行:
logview -h
4. 舉例:
-
logview awk.example -f logfile
該命令會每隔3s掃描一次日志文件,並將包含error或者failed單詞的行輸 出到標准輸出.
-
運行命令監視日志文件 - 例1
logview awk.example -f logfile --font-color=red --font=bold -s 5s -c ./command.sh -mlkong@tecent.com --mail-time=5m參數解釋:
參數解釋
-f:指定你所要監視的日志文件
--font-color=red:將錯誤信息以紅色字體打印
--font=bold:字體格式為bold
-s5s:每隔5s掃描一次日志文件
-m:將錯誤信息發送給 -m參數后的maillist
--mail-time=5m:每隔5分鍾發送一次email
-
運行命令監視日志文件 - 例2
logview awk.example -f logfile --font-color=red --font=bold -s 5s -c ./command.sh -m lkong@redhat.com --mail-time=5m errorfile.txt --notice=one
--notice=one:當有錯誤信息時,logview會將錯誤信息發送到你當前的tty
--notice=all:當有錯誤信息時,logview會將錯誤信息發送到你所有的tty
四、運行效果


五、壓縮包文件截圖

六、其他補充
其實該腳本的功能遠不止這些,至於其他功能你可以參考logview -h並結合腳本源碼獲知其用法。該腳本很適合高頻率的監視大型日志文件,假若剛啟動監視腳本時是日志文件總共有10000行,設置監頻率為3s,那么假設在這3s內日志文件新心曾800行,則該腳本查找錯誤字符串范圍為10000-10800而不是0-10800,試想假若所監視的日志文件是個大型的日志文件,超過10W行,而且要不停聽的監測,那么該腳本會節省很多資源和時間.而且腳本中的一些實現方法也值得學習和借鑒。當你將錯誤信息輸出到標准輸出而非文件時是,notice功能會自動被禁止掉,即使你指定了--notice參數。

