是否有一种方法可以使bash中的date
(或类似的东西)每次通过新行传送到正在进行的更新中?
我正在尝试获取持续的输出,通过awk
传递时间戳,然后将其写入具有正确写入日期的日志文件中(例如log.2018-06-21
)。新的一天到来时,输出将自动开始写入新的一天的日志文件。
简单地输入./my_server | awk >> log.date-of-write
这是我尝试过的(出于测试目的,格式为%T
而不是%F
)
$ awk '{ print strftime("%F %T %Z: ") $0; fflush(); }' |& tee -a "log.$(date +"%T")"
test1
2018-06-21 22:56:38 UTC: test1
test2
2018-06-21 22:56:40 UTC: test2
test3
2018-06-21 22:56:42 UTC: test3
^C
$ ls
log.22:56:36
$ cat log.22\:56\:36
2018-06-21 22:56:38 UTC: test1
2018-06-21 22:56:40 UTC: test2
2018-06-21 22:56:42 UTC: test3
$
所有测试均写入同一文件,因为原始时间以该格式使用。
答案 0 :(得分:1)
是的,这可以做到;您需要做的是定期生成一个新文件名,检查该文件名是否与您将输出写入的文件名相同,然后重新打开标准输出以指向新位置(如果它们不同)。
请注意,代替printf %(...)T
的{{1}}惯用语是一项新功能,如果您正在运行旧版本的bash,则可能不存在。 (您当然可以 切换到date
,但是这样做会慢得多)。
date
运行此命令时:
log_with_rotation() {
local outfile_name outfile_curr line
outfile_curr=
while IFS= read -r line; do
printf -v outfile_name 'log.%(%H:%M:%S)T' -1
if [[ $outfile_name != "$outfile_curr" ]]; then
outfile_curr=$outfile_name
exec >"$outfile_name"
fi
printf '%s\n' "$line"
done
}
...我得到两个输出文件:
your_program() {
printf '%s\n' "Cluster one, line one" "Cluster one, line two"
sleep 2
printf '%s\n' "Cluster two, line one" "Cluster two, line two"
}
your_program | log_with_rotation
答案 1 :(得分:0)
logger() {
file="log.$(date +"%T")"
echo -n $(date) >> $file
eval "$*" >> $file
}
只需将命令和参数放在函数名称之后,例如:
logger ls -la
我不知道这是不是你想要的。如果我误解了,您必须重新表述这个问题。