在用脚本实现模块功能时,往往涉及到日志功能,希望要实现的效果是用一个 write_log 命令,给一条出错消息作为输入,write_log 记录日志时自动加上日志级别、时间戳、脚本文件名和行号。形如:
[INFO] 2012-06-26 16:12:50 do_log @[test_log.sh:4]
时间戳、脚本文件名都比较容易获取,但是行号就有点麻烦。shell 中的 $LINENO 变量只能展开成当前行的行号,如果把 write_log 实现成函数的话,那么在函数使用 $LINENO,只能展开为函数体所在的行号,这不是我们所需要的。
这里可以用到linux系统下给命令指定别名alias命令,可以解决这一问题。
#! /bin/sh
function write_log()
{
local LOG_LEVEL=$1
local LOCATION=$2
local LOG_FILE=$3
local MESSAGE=$4
echo [$LOG_LEVEL] `date +%F" "%H:%M:%S` $MESSAGE @[$LOCATION] >>$LOG_FILE
}
# 这里只实现4个级别的日志
alias log_debug='write_log "DBG" "$0:$LINENO" my_log.log'
alias log_info='write_log "INF" "$0:$LINENO" my_log.log'
alias log_warn='write_log "WRN" "$0:$LINENO" my_log.log'
alias log_err='write_log "ERR" "$0:$LINENO" my_log.log'
然后只要使用命令 log_err 或者 log_debug 等命令输出日志即可,如使用
log_err "an error occur" 则可以在my_log.log 文件中得到形如以下的信息
[ERR] 2012-06-26 16:26:56 an error occur @[test_log.sh:4]
特别注意: 使用该功能的需要在脚本开头写上 #! /bin/sh 或者 #! /bin/bash --posix