运行 Python 来自 Bash 的脚本 - 如何重定向 Python 日志文件

Running Python Script from Bash - How to Redirect the Python Logging File

我正在 运行从 bash 脚本中创建一系列 python 脚本。

例如

nohup python $IMPORTER_PATH/importer.py -t styles -e $ELASTIC_URL -j $STYLES_DATA_PATH  -b -f &>> "$LOG_PATH/styles-$(date "+%d-%b-%Y").log"
nohup python $IMPORTER_PATH/importer.py -t objects -e $ELASTIC_URL -j $OBJECTS_DATA_PATH  -b -f &>> "$LOG_PATH/objects-$(date "+%d-%b-%Y").log"

目前我使用 &>> 成功生成了 stdout 和 stderr 的日志输出 我的 python 脚本中到处都是有用的打印语句,例如 print("Process started"),因此 bash 生成的日志文件确实有一些用处。

不过,我最近一直在清理我的日志文件,并使用 python logging 模块来生成更有针对性的日志文件。

这是我的 importer.py 脚本的摘录:

import argparse
import logging

def parse_args(args):
    parser = argparse.ArgumentParser()
    parser.add_argument("-t", "--type", help="Type of data to import")

def main(argv):
    # Set up Logging levels
    logging.basicConfig(filename='importer.log',
                        filemode='w', level=logging.INFO)
    es_log = logging.getLogger("elasticsearch")
    es_log.setLevel(logging.WARNING)

    args = parse_args(argv)
    logging.info('Started with %s', args)

现在的问题是 importer.log 是在 bash 脚本来自 运行 的任何地方创建的,并且因为我已经设置了 filemode='w',它会被覆盖,因为每个python 脚本被调用。

有没有办法将 importer.log 的输出重定向到我的日期日志文件,例如 "$LOG_PATH/styles-$(date "+%d-%b-%Y").log"

或者我应该向我的 importer.py ArgumentParser 添加另一个参数并将目标路径和文件名传递给它吗?

您可以根据需要格式化日志文件的名称。这是一个例子:

from datetime import datetime
log_name = f"importer_{datetime.strftime(datetime.now(), '%Y-%m-%d')}.log"
# This becomes: importer_2020-11-27.log

你当然可以改变日期格式...

你也可以使用这个:

import os
script_path = os.path.realpath(__file__)
# This points to your script: /path/to/script.py

如果您想将日志保存在那里,则获取脚本的路径。

log_name = os.path.join(os.path.dirname(script_path), log_name)
# now together with the first snippet of code you get: /path/to/importer_2020-11-27.log