首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将时间戳添加到bash脚本的日志输出

将时间戳添加到bash脚本的日志输出
EN

Ask Ubuntu用户
提问于 2022-09-23 08:49:21
回答 2查看 1.1K关注 0票数 2

我仍然在学习如何编写bash脚本,所以我已经从我搜索到的几个答案中拼凑了这个脚本。

代码语言:javascript
复制
#!/bin/bash
set -e
run_receiver(){
  pushd event-receiver
  npm run clean
  npm run build
  node dist/index.js "$@"
  popd
}

run_simulator(){
  pushd simulator
  npm run clean
  npm run build
  node dist/index.js "$@"
  popd
}

run_receiver "$@" | awk '{ print "[receiver]", $0 }' 2>&1 & 
run_simulator "$@" | awk '{ print "[simulator]", $0 }' 2>&1 &
#do other things....

此脚本同时运行多个节点应用程序,并在每个节点上先于[name],这样我就可以识别生成每个日志的哪个命令。

现在我也想在每一行中加上日期或某种时间戳。有人能告诉我我如何做到这一点吗?谢谢

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2022-09-23 10:36:22

首先,您可能希望在2>&1之前使用awk,因为如果您想要将时间戳和名称添加到错误消息和标准输出中,这需要首先发生。否则,标准错误消息将不会被awk看到。所以你想:

代码语言:javascript
复制
run_receiver "$@" 2>&1 | awk '{ print "[receiver]", $0 }' & 
run_simulator "$@" 2>&1 | awk '{ print "[simulator]", $0 }' &

接下来,对于时间戳,您可以使用date并将date的输出作为变量传递给awk

代码语言:javascript
复制
run_receiver "$@" 2>&1 | awk -v date="$(date)" '{ print date,"[receiver]", $0 }' & 

但这并不是您真正想要的:这将计算一次awk启动时的日期,因此所有命令都有相同的日期标记。您需要让awk计算每个输入行的日期,所以您需要一些更复杂的内容:

代码语言:javascript
复制
run_receiver "$@" 2>&1 | 
  awk '{ com="date -Iseconds"; com | getline date; print date,"[receiver]", $0 }' &

它将date -Iseconds存储在变量com中,然后执行com,通过awk的getline传递输出,并将其存储在随后打印的awk变量date中。但是,Ubuntu中的默认awk实际上是mawkmawk 缓冲它的输入,所以您还需要告诉它不要缓冲,否则时间戳将不正确。所以你需要再做一次调整:

代码语言:javascript
复制
run_receiver "$@" 2>&1 | 
  awk -Winteractive '{ 
    com="date -Iseconds"; 
    com | getline date; 
    close(com); 
    print date,"[receiver]", $0 
}' &

这将产生这样的输出:

代码语言:javascript
复制
[receiver] 2022-09-23T13:33:23+03:00 line 1
[receiver] 2022-09-23T13:33:24+03:00 line 2
[receiver] 2022-09-23T13:33:25+03:00 line 3
[receiver] 2022-09-23T13:33:26+03:00 line 4

您还可以使用GNU awk (在Ubuntu上称为gawk ),它为日期操作提供了一些内置函数:

代码语言:javascript
复制
run_receiver "$@" 2>&1 | 
    gawk '{ date=strftime("%Y-%m-%d %H:%M:%S"); print "[receiver]",date,$0}' 

它产生这样的输出:

代码语言:javascript
复制
[receiver] 2022-09-23 13:35:42 line 1
[receiver] 2022-09-23 13:35:43 line 2
[receiver] 2022-09-23 13:35:44 line 3
[receiver] 2022-09-23 13:35:45 line 4
票数 3
EN

Ask Ubuntu用户

发布于 2022-09-23 12:11:27

您可以使用来自ts包的moreutils命令(可从“宇宙”存储库获得),将[name]合并到可选的格式字符串中,以消除对awk的需求。前:

代码语言:javascript
复制
run_receiver "$@" 2>&1 | ts '[receiver] %Y-%m-%d %H:%M:%S'
票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1431866

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档