Tee编写的过滤输出将其写成文件,但没有TEE写入控制台



我知道已经问过类似的问题,但是我找不到解决这种特殊情况的任何问题。

我有一系列使用logging库(打印到stderr)的不同python脚本。这些脚本通过bash脚本将其串在一起,该脚本将它们顺序称为,并通过cron安排。在每次运行结束时,BASH脚本通过电子邮件发送了各种出口代码的摘要,并旨在包含各种其他记录消息(即,如果存在critical级别记录的发生,则应将其纳入我所说的内容" cron log")。

由于Python代码本身在记录中很详尽,因此我不想意外地给自己发送5-10MB日志,而我只希望特定的输出将其送入CRON日志。我想使用 tee从python过滤stderr记录,并且仅直接特定消息到cron log,但是 all 消息仍然应该使其成为控制台。p>对于可重复性,请说我有以下bash脚本:

#!/bin/bash
LOGPFX="BASH"  # if a log msg has this term, put it in CRONLOG
CRONLOG="cronlog.txt"
exec 2> >(grep ${LOGPFX} | tee -a ${CRONLOG})
# run
python test.py

这是test.py的内容:

import logging
def get_logger():
    logger = logging.getLogger("testlog")
    logger.setLevel(logging.INFO)
    lformat = "%(asctime)s - %(levelname)s - %(module)s - %(funcName)s - %(message)s"
    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    handler.setFormatter(logging.Formatter(lformat))
    logger.addHandler(handler)
    return logger
if __name__ == '__main__':
    logger = get_logger()
    logger.info("Should not appear in console but not cronlog.txt")
    logger.info("[BASH INFO] Should appear in both")

"[BASH INFO] Should appear in both"消息 die 成功地将其变成了cron日志,但问题是第一个日志记录消息已完全从控制台输出中省略。我如何过滤这些消息,以使那些通过grep的消息将其进入控制台和日志,而所有其他消息仅到达控制台?

我知道这是需要更改的行:

exec 2> >(grep ${LOGPFX} | tee -a ${CRONLOG})

cronlog.txt的内容:

$ cat cronlog.txt 
2017-12-21 08:19:39,267 - INFO - test - <module> - [BASH INFO] Should appear in both

我还测试了此版本的bash:

#!/bin/bash
LOGPFX="BASH"
CRONLOG="cronlog.txt"
ftee () {
    echo "I FOUND THIS: ${1}"
    echo "$1" >> ${CRONLOG}
}
exec 2> >(grep ${LOGPFX} | ftee) 2>&1
# run
python test.py

适当地将所有内容都定向到控制台,但不会将正确的消息写入日志("I FOUND THIS: ${1}"行打印一个空字符串)

tee写入另一个过程替换(在写作之前进行GREP)将有能力:

# all-caps variable names are used for variables with meaning to the shell
# don't use them for names you assign yourself.
logpfx="BASH"  # if a log msg has this term, put it in CRONLOG
cronlog="cronlog.txt"
exec 3>&2 # backup original stderr on FD 3
exec 2> >(tee -a >(grep "$logpfx" >"$cronlog"))

请注意,在邮寄日志之前,您应该确保关闭文件描述符并允许它齐平。因此,在收集要登录的内容和发送电子邮件之前,您需要运行:

exec 2>&3 # restore backup of original FD 3, so tee and grep can exit

相关内容

  • 没有找到相关文章

最新更新