【问题标题】:How to add a timestamp to bash script log for every command and exclude set, echo, log?如何为每个命令添加时间戳到 bash 脚本日志并排除集合、回显、日志?
【发布时间】:2015-09-29 14:31:33
【问题描述】:

如何为每个命令(不包括 set、echo、log)添加时间戳到 bash 脚本日志?

我正在运行一个备份脚本并希望记录所有带有时间戳的命令:

 #./svnbackup.sh 2&>1 | timestamp_xtrace > ./svn-backup.log 2>&1

这是我的功能,它不起作用:

 timestamp_xtrace() {
   while IFS= read -r line; do
     if [[ "$line" =~ "^+ set" ]] && [[ "$line" =~ "^+ echo" ]] && [[ "$line" =~ "^+ log" ]]; then
         echo "$(date) $line";
     fi
   done
 }

我想排除一些命令(set、echo、log...)但它不起作用.. 有人有解决我问题的提示吗?

【问题讨论】:

  • 那些&&s不应该是||s吗?
  • 我建议使用logger。
  • 我想记录所有行,但行以“set”或“echo”或“log”开头。

标签: linux bash logging


【解决方案1】:

我找到了一个可行的解决方案:

timestamp_xtrace() {
   while IFS= read -r line; do
     if [[ "$line" != "+ set"* ]] && [[ "$line" != "+ echo"* ]] && [[ "$line" != "+ log"* ]]; then
       echo "$(date) $line";
     fi
   done
}

我将正则表达式 (=~ "^ "+ echo") 更改为 (!= "+ echo"*),因此测试匹配正确的行:

# cat << EOF | timestamp_xtrace
+ somecmd
+ echo "hello world!"
hello world!
+ svnadmin -args
EOF

输出:

Wed Sep 30 09:12:43 CEST 2015 + somecmd
Wed Sep 30 09:12:43 CEST 2015 hello world!
Wed Sep 30 09:12:43 CEST 2015 + svnadmin -args

【讨论】:

    【解决方案2】:

    这个 bash 函数应该可以完成这项工作:

    timestamp_xtrace() { 
       while IFS= read -r line; do
          [[ "$line" =~ ^[[:blank:]]*(set|echo|log) ]] && echo "$(date):: $line"
       done
    }
    

    ^[[:blank:]]*(set|echo|log) 将匹配set OR echo OR log 在行首可选地以空格或制表符开头。

    测试:

    cat << EOF | timestamp_xtrace
    foo bar
    log something testing
    echo and more
    abc xyz
    EOF
    

    输出:

    Tue Sep 29 10:40:44 EDT 2015:: log something testing
    Tue Sep 29 10:40:44 EDT 2015:: echo and more
    

    【讨论】:

    • 是的,但是 OP 的功能也在标准输出上打印。
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 2015-08-30
    • 2011-02-05
    • 2020-08-18
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多