高效工作的一个诀窍就是尽可能自动化, 简便化。 比如, 公司里, 要搜索多个集群下的应用日志来排查问题, 需要使用 pssh:
pssh -i -h api_hangzhou.iplist "grep 101-70795118 /path/to/info.2015-03-03.*.log"
pssh -i -h api_hangzhou.iplist "grep 101-70795118 /path/to/info.log*"
这样有什么不方便呢?
1. 记忆日志路径不容易, 每次要粘贴, 你知道程序员的记忆力是不佳的;
2. 手工敲入命令太长, api_hangzhou.iplist 敲起来也比较费劲。
3. 抓取不同日期, 不同子系统, 不同集群下的日志不够灵活。 有时, 难以确定是哪个集群, 就必须在所有集群下进行全遍历。
总之, 程序员就是要懒, 尽可能消除不方便之处, 尽可能自动化,简便化。 因此,花了一天时间, 写了一个脚本来处理这个问题(话说我SHELL 也用的不熟啊, 不过是解决具体问题啦)。 具体用法如下:
usage: lg -k keyword -rregion -ddate
其中, -k keyword 是内容关键字, -r, -d 都是可选的。 -r 若不指定为默认杭州集群; -d 若不指定为今天。
最短命令可以为 lg -k keyword , 在杭州集群今天的日志下搜索 keyword 的多个子系统的日志。
当然, 该命令对于读者来说, 可能没有太多作用, 主要是做法值得借鉴。 编写类似脚本时, 可以借鉴下面的程序。
ln -s /home/qin.shuq/greplog /usr/local/bin/lg
greplog 脚本:
#!/bin/bash usage() { echo 'usage: lg -k keyword -rregion -ddate ' echo ' lg --keyword keyword --region region --date date' echo ' lg -h or lg --help' echo 'desc: grep api-regionmaster log by keyword in specified region in specified date.' echo 'options:' echo ' -k keyword [Required]: such as vmName, diskId, requestId ' echo ' -r region [Optional]: [h, hangzhou, hz, q, qingdao, qd, b,beijing, bj, ' echo ' f,fujian, fj, shenzhen, sz, sichuan sc, a, all] ;' echo ' if not specified, default: hz' echo ' -d date [Optional]: such as 2015-02-14 ; ' echo ' if not specified, default to today ' echo 'eg. lg -k i-2503rpkgr -rhz -d2015-02-10' echo ' lg -k i-2503rpkgr ' echo ' lg -k i-2503rpkgr -rhz ' echo ' lg -k i-2503rpkgr -d2015-02-10' echo ' lg -k i-2503rpkgr -ra -d2015-02-10' echo ' lg -h or lg --help' } if [ $# == 0 ] then usage exit 1 fi TEMP=`getopt -o hk:r::d:: -l keyword:,region,date,help -n '/home/qin.shuq/greplog' -- "$@"` if [ $? -ne 0 ] then usage exit 1 fi eval set -- "${TEMP}" keyword="" region="" infolog="" while true ; do case "$1" in -k|--keyword) keyword="$2" shift 2 ;; -r|--region) region="$2" shift 2 ;; -d|--date) if [[ $2 =~ ([0-9]{4}-[0-9]{2}-[0-9]{2}) ]] then infolog="info.$2.log info.$2.*.log"; else infolog="info.log info.log.*" fi shift 2 ;; -h|--help) usage exit 0 ;; --) shift break ;; ?) echo "Internal error!" exit 1 ;; esac done if [[ $keyword = '' ]] then echo 'Error: Required parameter -k keyword not specified' usage exit 1 fi if [[ $infolog = '' ]] then infolog="info.log info.log.*" fi case $region in h|hz|HZ|Hz|hZ|hangzhou) region="hangzhou" ;; q|qd|QD|Qd|qD|qingdao) region="qingdao" ;; b|bj|BJ|Bj|bJ|beijing) region="beijing" ;; f|fj|FJ|Fj|fJ|fujian) region="fujian" ;; sz|SZ|Sz|sZ|shenzhen) region="shenzhen" ;; sc|SC|Sc|sC|sichuan) region="sichuan" ;; a|all) region="hangzhou qingdao beijing fujian shenzhen sichuan" ;; *) region="hangzhou" ;; esac echo "keyword=$keyword, region=[$region], infolog=$infolog" iplistPath=/home/admin regionmasterLogPath=/home/admin/xxx apiLogPath=/home/admin/xxx for reg in $region ; do api_iplistFile="api_${reg}.iplist" for log in $infolog ; do echo "pssh -i -h $iplistPath/$api_iplistFile "grep $keyword $apiLogPath/$log"" pssh -i -h $iplistPath/$api_iplistFile "grep $keyword $apiLogPath/$log" | grep -v "FAILURE" done done for reg in $region ; do regionmaster_iplistFile=regionmaster_${reg}.iplist for log in $infolog ; do echo "pssh -i -h $iplistPath/$regionmaster_iplistFile "grep $keyword $regionmasterLogPath/$log"" pssh -i -h $iplistPath/$regionmaster_iplistFile "grep $keyword $regionmasterLogPath/$log" | grep -v "FAILURE" done done