运行 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
我正在 运行从 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