簡體   English   中英

Python:將日志記錄模塊與 configparser 或 argparser 一起使用

[英]Python: Use logging module with configparser or argparser

當還利用 configparser 文件加載包含您希望保存日志的位置的配置文件時,使用 Python 的日志記錄模塊記錄腳本正在執行的所有操作的最佳方法是什么。

這是我的示例代碼:

import sys
import os
import logging
import configparser
import argparse

### Create Functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
def get_logger(LOG_DIR, FULL_LOG_PATH):
    """Create logger."""
    # Create LOG_DIR if it doesn't exist already

    try:
        os.makedirs(f"{LOG_DIR}")

    except:
        pass

    try:
        # Create logger and set level
        logger = logging.getLogger(__name__)
        logger.setLevel(level=logging.INFO)

        # Configure file handler
        formatter = logging.Formatter(
            fmt = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',
            datefmt = "%Y-%m-%d_%H-%M-%S")
        fh = logging.FileHandler(f"{FULL_LOG_PATH}")
        fh.setFormatter(formatter)
        fh.setLevel(level=logging.INFO)

        # Add handlers to logger
        logger.addHandler(fh)
        return  logger

    except:
        sys.exit(-1)

def parse_cl_args():
    """Set CLI Arguments."""

    try:
        # Initiate the parser
        parser = argparse.ArgumentParser(
            description="Script to scrape Twitter users account information."
        )
        # Add optional arguments
        parser.add_argument(
            "-c", "--config-file",
            metavar='Config-file',
            help="Full path to the global config file containing paths/file names for script.",
            required=True
        )

        # Read parsed arguments from the command line into "args"
        args = parser.parse_args()

        # Assign the file name to a variable and return it
        config_file_path = args.config_file
        return config_file_path

    except:

        sys.exit(-1)

def parse_config_file(config_file_path):

    try:
        config = configparser.ConfigParser()
        config.read(config_file_path)
        return config
    except:
        sys.exit(-1)

# A bunch of other functions

if __name__ == '__main__':
    # parse command line args
    config_file_path = parse_cl_args()

    # parse config file
    config = parse_config_file(config_file_path)

    # Set logging path
    LOG_DIR = os.path.join(config["PATHS"]["LOG_DIR"])

    # Set log file name
    FULL_LOG_PATH = os.path.join(config["PATHS"]["LOG_DIR"], "mylog.log")

    # Get logger
    logger = get_logger(
        LOG_DIR = LOG_DIR, 
        FULL_LOG_PATH= FULL_LOG_PATH
        )

get_logger() 行上方的所有內容都無法記錄在記錄器中,但如果不先加載我的命令行參數( config_file.ini )然后解析該文件(其中包含我想要的位置)就無法創建記錄器我的日志要保存)。 有一個更好的方法嗎?

如果您想在知道日志文件的位置之前記錄日志,但也希望這些日志在文件中,您可以使用MemoryHandler ,它是一種特殊類型的 BufferingHandler。 所以你的程序流程是:

  1. 設置記錄器
  2. 將 MemoryHandler 添加到此記錄器
  3. 在使用記錄器時執行諸如讀取配置文件之類的操作,您必須創建日志
  4. 使用配置中的值設置 FileHandler
  5. 在 MemoryHandler 上調用setTarget(file_handler)將 FileHandler 傳遞給它
  6. 在 MemoryHandler 上調用flush() -> 將步驟 3 中的日志寫入文件
  7. 您現在可以選擇刪除 MemoryHandler

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM