shell脚本中为什么使用log
大家想一想,当你写的代码在遇到一些不明所以的问题时,如何快速的debug呢? GDB是一方面,但是不怎么友好对使用者来说?那还有没有其他的方式呢?
有的,就是log。我们应该把自己写的程序跑过的一些东西,以log的形式保存在 一个特殊的位置,大部分发行版中,大部分位置是 /var/log,也就是如果你确实 找不到一个合适的位置来放置log,那么,这个位置绝对没有问题。
C/C++或者java python等这种强编译型的语言有日志文件比较常见,但是shell也 有log,不知道你之前是否能想到。
下面的代码主要参考这个link。
cat logger.sh
sudo chown $USER:$USER -R /var/log
SCRIPT_LOG=/var/log/SystemOut.log
touch $SCRIPT_LOG
sudo chown $USER:$USER $SCRIPT_LOG
function SCRIPTENTRY(){
timeAndDate=`date`
script_name=`basename "$0"`
script_name="${script_name%.*}"
echo "[$timeAndDate] [DEBUG] > $script_name $FUNCNAME" >> $SCRIPT_LOG
}
function SCRIPTEXIT(){
script_name=`basename "$0"`
script_name="${script_name%.*}"
echo "[$timeAndDate] [DEBUG] < $script_name $FUNCNAME" >> $SCRIPT_LOG
}
function ENTRY(){
local cfn="${FUNCNAME[1]}"
timeAndDate=`date`
echo "[$timeAndDate] [DEBUG] > $cfn $FUNCNAME" >> $SCRIPT_LOG
}
function EXIT(){
local cfn="${FUNCNAME[1]}"
timeAndDate=`date`
echo "[$timeAndDate] [DEBUG] < $cfn $FUNCNAME" >> $SCRIPT_LOG
}
function INFO(){
local function_name="${FUNCNAME[1]}"
local msg="$1"
timeAndDate=`date`
echo "[$timeAndDate] [INFO] $msg" >> $SCRIPT_LOG
}
function DEBUG(){
local function_name="${FUNCNAME[1]}"
local msg="$1"
timeAndDate=`date`
echo "[$timeAndDate] [DEBUG] $msg" >> $SCRIPT_LOG
}
function ERROR(){
local function_name="${FUNCNAME[1]}"
local msg="$1"
timeAndDate=`date`
echo "[$timeAndDate] [ERROR] $msg" >> $SCRIPT_LOG
}
cat test_logger.sh
#!/bin/sh
source ./logger.sh
SCRIPTENTRY
updateUserDetails(){
ENTRY
DEBUG "Username: $1, Key: $2"
INFO "User details updated for $1"
EXIT
}
INFO "Updating user details..."
updateUserDetails "cubicrace" "3445"
rc=2
if [ ! "$rc" = "0" ]
then
ERROR "Failed to update user details. RC=$rc"
fi
SCRIPTEXIT
下面是详细的测试log:
vimer@user-HP:/var/log$ cat SystemOut.log
[2022年 01月 08日 星期六 21:17:23 CST] [DEBUG] > test_logger SCRIPTENTRY
[2022年 01月 08日 星期六 21:17:23 CST] [INFO] Updating user details...
[2022年 01月 08日 星期六 21:17:23 CST] [DEBUG] > updateUserDetails ENTRY
[2022年 01月 08日 星期六 21:17:23 CST] [DEBUG] Username: cubicrace, Key: 3445
[2022年 01月 08日 星期六 21:17:23 CST] [INFO] User details updated for cubicrace
[2022年 01月 08日 星期六 21:17:23 CST] [DEBUG] < updateUserDetails EXIT
[2022年 01月 08日 星期六 21:17:23 CST] [ERROR] Failed to update user details. RC=2
[2022年 01月 08日 星期六 21:17:23 CST] [DEBUG] < test_logger SCRIPTEXIT
[2022年 01月 08日 星期六 21:17:57 CST] [DEBUG] > test_logger SCRIPTENTRY
[2022年 01月 08日 星期六 21:17:57 CST] [INFO] Updating user details...
[2022年 01月 08日 星期六 21:17:57 CST] [DEBUG] > updateUserDetails ENTRY
[2022年 01月 08日 星期六 21:17:57 CST] [DEBUG] Username: cubicrace, Key: 3445
[2022年 01月 08日 星期六 21:17:57 CST] [INFO] User details updated for cubicrace
[2022年 01月 08日 星期六 21:17:57 CST] [DEBUG] < updateUserDetails EXIT
[2022年 01月 08日 星期六 21:17:57 CST] [ERROR] Failed to update user details. RC=2
[2022年 01月 08日 星期六 21:17:57 CST] [DEBUG] < test_logger SCRIPTEXIT