【问题标题】:pipe python logging stdout stream output to grep管道 python 记录标准输出流输出到 grep
【发布时间】:2023-06-02 11:22:01
【问题描述】:

我不久前就知道了原因,但后来我忘记了,5 分钟的谷歌搜索还没有找到答案。

我编写了一个有两个处理程序的 python 脚本。一个用于文件,一个用于流。

一切都如我所愿。

现在,我想快速 grep 查找正在打印到终端的输出中的某些内容,但是通过 grep 管道输出脚本的输出似乎不起作用,因为所有输出仍然打印到终端。

我使用的是 unix 和 python 2.7

这可能是一个重复的问题,但我找不到答案。

这是我的日志记录模块设置:

def setup_logger(verbosity):
    #logger = logging.getLogger(regress.app_name)
    logger = logging.getLogger('components')
    logger.setLevel(logging.DEBUG)
    # create file handler which logs even debug messages
    fh = logging.FileHandler(Config.logging_file_name, mode='w')
    fh.setLevel(logging.DEBUG)
    # create console handler with a higher log level
    ch = logging.StreamHandler()
    ch.setLevel({True:logging.DEBUG, False:logging.INFO}[verbosity])
    # create formatter and add it to the handlers
    file_formatter = logging.Formatter('%(asctime)s - %(pathname)s - %(funcName)s - %(name)s - %(levelname)s - %(lineno)s - %(message)s')

    console_formatter = logging.Formatter('%(filename)s - %(lineno)s - %(levelname)s - %(message)s')
    fh.setFormatter(file_formatter)
    ch.setFormatter(console_formatter)
    # add the handlers to the logger
    logger.addHandler(fh)
    logger.addHandler(ch)

    #logging.abort = abort
    #logging.abort("testing...")
    #logger.info("does this happen?")

    #logging.func = func
    #logging.func()
    #logger.func()

我的脚本调用如下所示:

<script_name> <script args> | grep -i <search_string>

【问题讨论】:

  • Logging 将消息打印到 stderr,但您正在管道 stdout。 *.com/questions/2342826/…
  • @Blender 哇,我不知道!如果您想将其作为答案,我会将其标记为已回答

标签: python linux pipe stdout


【解决方案1】:

正如@Blender 在原始问题下方的 cmets 中提到的那样,您只需要重定向 stderr。您可以通过在管道前添加2>&1 重定向来做到这一点。所以,例如,

python main.py 2>&1 | grep INFO

将过滤main.py 记录的任何INFO 行。

【讨论】: