是否可以记录整个脚本?

时间:2018-05-04 10:54:12

标签: linux bash

我已经部署了一个post-receive hook脚本,我希望将整个输出日志作为以date开头的块获取。我尝试了一种方法,但它采用逐行日志,这意味着我必须对每一行放置该命令以获取日志。从date开始,有没有办法获取整个脚本日志?

脚本文件如下所示:

#!/bin/bash
any_command | ts '[%F %T]' >> /home/Man/Man_log.log
second_command | ts '[%F %T]' >> /home/Man/Man_log.log
third_command | ts '[%F %T]' >> /home/Man/Man_log.log

看到我必须将此行| ts '[%F %T]' >> /home/Man/Man_log.log放在每个命令上以获取日志。我有90行,所以这不是一个完美的方法。我需要一种有效的方法,比如我的脚本中只有一行将整个脚本的输出作为日志,并将其存储到从日期开始的另一个Man_log.log文件中。

我想要的是与此相似的。

#!/bin/bash
ts '[%F %T]' >> /home/Man/Man_log.log #a command which can store logs of every command below this to a separate file starting with date
any_command
second_command
third_command

2 个答案:

答案 0 :(得分:1)

最简单的方法可能是修改脚本以便每次调用日期:

(date && anycommand) >> out.log

如果您无法修改脚本,那么您可以对命令进行分组,例如:

parse()

在括号中对(命令列表)进行分组会使它们像执行单个单元一样执行。 “sub-shell

答案 1 :(得分:0)

假设这是应该给我们一些日志的脚本:

#!/bin/bash

echo "log_line1
log_line2
log_line3
log_line4"

让我们称之为script.sh

./script.sh | printf "%(%F)T {\n$(cat)\n}" >> Man_log.log身份运行,Man_log.log的内容将是:

2018-05-04 {
log_line1
log_line2
log_line3
log_line4
}

现在让我解释管道的确切含义。

  • %(%F)T将替换为当前日期 - MONTH - DAY 格式
  • $(cat)./script.sh输出的日志。通常,它是作为标准输入接收的数据。 基本上./script.sh将其日志写入标准输出。然后管道将该标准输出传递给echo的标准输入。不带参数的cat运行与cat /dev/stdin相同。