【发布时间】:2019-07-05 05:12:10
【问题描述】:
在 Linux 中,我在初始化脚本 (SysVInit) 中启动了一个名为 $cmd 的程序。我已经将$cmd 的stdout 和stderr 重定向到两个不同的日志文件中,分别称为$stdout_log 和$stderr_log。现在我还想在打印到日志文件的每一行前面添加一个时间戳。
我尝试编写一个名为 log_pipe 的函数,如下所示:
log_pipe() {
while read line; do
echo [$(date +%Y-%m-%d\ %H:%M:%S)] "$line"
done
}
然后将我的脚本的输出通过管道传输到这个函数中,然后将它们重定向到日志文件,如下所示:
$cmd | log_pipe >> "$stdout_log" 2>> "$stderr_log" &
我得到的是一个空的 $stdout.log (stdout) 应该没问题,因为 $cmd 通常不会打印任何东西。还有一个 $stderr.log 文件,只有时间戳但没有错误文本。
我的推理错误在哪里?
PS:因为问题存在于初始化脚本中,我只想使用基本的 shell 命令,没有额外的包。
【问题讨论】:
-
你考虑过'ts'命令吗?坦率地说,不需要 log_pipe() 程序,因为 unix/linux 已经有了 'ts' 命令,它完全可以满足您的要求。执行“$ man ts”,看看是否满足您的要求。例如用法:“$ cmd 2>&1 | ts '[%Y-%m-%d %H:%M:%S %Z]' | tee /your-path/outputs.log > /dev/null 2> &1 &"
标签: shell logging pipe stdout init