Code block

Google Code Prettify + AD Sense

2016年12月14日 星期三

Bash:格式化log內容

統一log訊息前面都加上時間,是不是好用就看個人的習慣
某些程度來說,自己寫的script比較好控制,不然直接用指令 logger 也是挺方便的


#/bin/sh
LOG_FILE=/xxxx/MyLog.log

PipeToMyLog(){
  while IFS= read -r msg; do
  echo -e "`date +%Y/%m/%d\ %H:%N:%S` - $msg" >> $LOG_FILE
done > /dev/stdin
}

FormatMsg(){
  echo -e "`date +%Y/%m/%d\ %H:%N:%S` - $*" >> $LOG_FILE
}

### 以下為使用方式範例
## 使用方式1:透過pipe處理
ls / | PipeToMyLog

## 使用方式2:帶參數方式輸入 - (這種用法比較類似系統內建的logger指令)
FormatMsg "Last status is :$?"

Bash:取得shell script所在目錄

有時候寫了script要給別人用,但是不確定別人會把script放在什麼地方,或是排cron的時候,執行的方式會是什麼,造成log寫錯位置

透過以下方式,取得script所在路徑後,放到 WORK_PATH 這個變數
就比較容易讓log寫在同一個目錄
例如:cmd >> $WORK_PATH/ScriptLog.log

#/bin/bash
FULL_CMD="$0"
DIRNAME_BIN=`which dirname`

## 檢查指令dirname是否存在
if [ -z "${DIRNAME_BIN}" ] || [ ! -x "${DIRNAME_BIN}" ]; then
  echo "Can't use command: dirname"
  exit 1
fi

TMP_WORK_PATH=`${DIRNAME_BIN} ${FULL_CMD}`
echo "${TMP_WORK_PATH}" |grep ^/ > /dev/null
if [ $? -gt 0 ]; then if [ "${TMP_WORK_PATH}" == '.' ]; then
WORK_PATH=$PWD
else
WORK_PATH="$PWD/${TMP_WORK_PATH}"
fi else WORK_PATH=${TMP_WORK_PATH} fi unset TMP_WORK_PATH DIRNAME_BIN