在 Python 中使用 concurrent.futures.ProcessPoolExecutor 时为每个进程创建一个单独的记录器
Create a separate logger for each process when using concurrent.futures.ProcessPoolExecutor in Python
我正在清理大量 CSV 数据转储。我能够使用 gawk
将单个大文件拆分为较小的文件,最初使用 unix SE Query 作为以下流程:
BIG CSV file -> use gawk script + bash -> Small CSV files based on columns
我有大约 12 个拆分的 csv 文件,这些文件是使用上述流程创建的,每个文件中都有 ~170K 行。
我在 Windows 10 机器上使用 python3.7.7
。
代码
def convert_raw_data(incoming_line, f_name, line_counter):
# do some decoding magic
# catch exception and try to log it into the a logger file under `f_name.log`
def convert_files(dir_name, f_name, dest_dir_name):
# Open the CSV file
# Open the Destination CSV file to store decoded data
line_counter = 1
for line in csv_reader:
# convert raw HEX to Floating point values using `convert_raw_data` function call
line_counter = line_counter + 1
status = convert_raw_data(csv)
if status:
return f'All good for {f_name}.'
else:
return f'Failed for {f_name}'
def main():
# Parse Arguments Logic here
# get CSV Files and their respective paths
csv_files = get_data_files_list(args.datasets)
# decode raw data from each split csv file as an individual process
with concurrent.futures.ProcessPoolExecutor() as executor:
results = [ executor.submit(convert_files, dir_name, f_name, dest_dir) for dir_name, f_name in csv_files ]
for f in concurrent.futures.as_completed(results):
print(f.result())
要求
我希望在 ProcessPoolExecutor
生成的每个进程中设置一个名为 f_name.log
的 logging
记录器,并希望使用相应的解析文件名存储日志。我不确定我是否应该使用类似的东西:
def convert_raw_data(...., logger):
logger.exception(raw_data_here)
def convert_files(....):
logger = logging.basicConfig(filename=f_name, level=logging.EXCEPTION)
或者在多处理环境中使用日志记录模块有什么注意事项吗?
找到完成此任务的简单方法:
import logging
def create_log_handler(fname):
logger = logging.getLogger(name=fname)
logger.setLevel(logging.ERROR)
fileHandler = logging.FileHandler(fname + ".log")
fileHandler.setLevel(logging.ERROR)
logger.addHandler(fileHandler)
formatter = logging.Formatter('%(name)s %(levelname)s: %(message)s')
fileHandler.setFormatter(formatter)
return logger
我在 convert_files(.....)
函数中调用了 create_log_handler
,然后相应地使用了 logger.info
和 logger.error`。
通过将 logger
作为参数传递给 convert_raw_data
,我什至能够在每个进程的每个 csv 文件中记录错误数据点。
我正在清理大量 CSV 数据转储。我能够使用 gawk
将单个大文件拆分为较小的文件,最初使用 unix SE Query 作为以下流程:
BIG CSV file -> use gawk script + bash -> Small CSV files based on columns
我有大约 12 个拆分的 csv 文件,这些文件是使用上述流程创建的,每个文件中都有 ~170K 行。
我在 Windows 10 机器上使用 python3.7.7
。
代码
def convert_raw_data(incoming_line, f_name, line_counter):
# do some decoding magic
# catch exception and try to log it into the a logger file under `f_name.log`
def convert_files(dir_name, f_name, dest_dir_name):
# Open the CSV file
# Open the Destination CSV file to store decoded data
line_counter = 1
for line in csv_reader:
# convert raw HEX to Floating point values using `convert_raw_data` function call
line_counter = line_counter + 1
status = convert_raw_data(csv)
if status:
return f'All good for {f_name}.'
else:
return f'Failed for {f_name}'
def main():
# Parse Arguments Logic here
# get CSV Files and their respective paths
csv_files = get_data_files_list(args.datasets)
# decode raw data from each split csv file as an individual process
with concurrent.futures.ProcessPoolExecutor() as executor:
results = [ executor.submit(convert_files, dir_name, f_name, dest_dir) for dir_name, f_name in csv_files ]
for f in concurrent.futures.as_completed(results):
print(f.result())
要求
我希望在 ProcessPoolExecutor
生成的每个进程中设置一个名为 f_name.log
的 logging
记录器,并希望使用相应的解析文件名存储日志。我不确定我是否应该使用类似的东西:
def convert_raw_data(...., logger):
logger.exception(raw_data_here)
def convert_files(....):
logger = logging.basicConfig(filename=f_name, level=logging.EXCEPTION)
或者在多处理环境中使用日志记录模块有什么注意事项吗?
找到完成此任务的简单方法:
import logging
def create_log_handler(fname):
logger = logging.getLogger(name=fname)
logger.setLevel(logging.ERROR)
fileHandler = logging.FileHandler(fname + ".log")
fileHandler.setLevel(logging.ERROR)
logger.addHandler(fileHandler)
formatter = logging.Formatter('%(name)s %(levelname)s: %(message)s')
fileHandler.setFormatter(formatter)
return logger
我在 convert_files(.....)
函数中调用了 create_log_handler
,然后相应地使用了 logger.info
和 logger.error`。
通过将 logger
作为参数传递给 convert_raw_data
,我什至能够在每个进程的每个 csv 文件中记录错误数据点。