【问题标题】:Python logging won't write to filePython日志不会写入文件
【发布时间】:2015-12-04 16:29:36
【问题描述】:

所以我正在使用我发现并稍微调整的异常日志记录模块。但我似乎无法弄清楚为什么它不会创建一个文件并写入它。

这是我的模块:

"""Exception logging"""
import sys
import traceback
import logging

logger = logging
def setup_logging_to_file():
    logger = logging.basicConfig( filename='error_log.txt',
                                filemode='w',
                                level=logging.DEBUG,
                                format= '%(asctime)s - %(levelname)s - %(message)s',
                            )


def log_exception(e):
    logger.error(
    "Function {function_name} raised {exception_class} ({exception_docstring}): {exception_message}".format(
    function_name = extract_function_name(), #this is optional
    exception_class = e.__class__,
    exception_docstring = e.__doc__,
    exception_message = e.message))

def extract_function_name():
    tb = sys.exc_info()[-1]
    stk = traceback.extract_tb(tb, 1)
    fname = stk[0][3]
    return fname

我在启动时运行 setup_logging_to_file(),然后每当遇到异常时,我都会调用 log_exception 并将异常传递给它,但它甚至不会创建 error_log.txt 文件

from app.exception_logging import log_exception, setup_logging_to_file

def myFunc():
    try:
        ....
    except Exception as ex:        
        log_exception(ex)

【问题讨论】:

  • 您应该删除logging.basicConfigformat 参数上的多余逗号。此外,当您调用log_exception() 时,logger 是对logging 的引用,而不是setup_logging_to_file 中使用的logger 变量,因为全局变量是“只读的”。您应该使用函数参数。另一方面,我不明白你为什么写logger = logging:就用logging
  • 启动时调用setup_logging_to_file是什么意思?你从哪里称呼它?
  • 我想创建一个项目范围的日志记录模块,这样我就可以在我的任何 try/catch 块中调用 log_exception 函数。当我启动我的项目时,我调用setup_logging_to_file() 来初始化我的记录器变量,但我改变了@Loïc G 所说的

标签: python exception error-logging


【解决方案1】:

我遇到了同样的问题。最后我决定这样做:

import logging.config

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler("log_file.log"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

然后在代码中,您可以按如下方式使用记录器:

logger.info('message')
logger.error('message')

【讨论】:

    【解决方案2】:

    按照 cmets 中的建议 - 您可以直接访问日志记录。

    工作示例,名为 logtest.py 的文件:

    """Exception logging"""
    import sys
    import traceback
    import logging
    
    logging.basicConfig( filename='/tmp/error_log.txt',
                                filemode='w',
                                level=logging.DEBUG,
                                format= '%(asctime)s - %(levelname)s - %(message)s',
                    )
    
    
    def log_exception(e):
        logging.error(
        "Function {function_name} raised {exception_class} ({exception_docstring}): {exception_message}".format(
        function_name = extract_function_name(), #this is optional
        exception_class = e.__class__,
        exception_docstring = e.__doc__,
        exception_message = e.message))
    
    def extract_function_name():
        tb = sys.exc_info()[-1]
        stk = traceback.extract_tb(tb, 1)
        fname = stk[0][3]
        return fname
    

    目标文件:

    from logtest import log_exception
    
    try:
       open("somthingnotthere",'r')
    except Exception as ex:        
        log_exception(ex)
    

    【讨论】:

    • 我将所有日志记录在它自己的 python 文件中,因此在我的项目中,我可以在我的所有 try/catch 块中调用该函数
    • 已更新以显示包含两个文件的示例。您真正做错的是在 setup_logging_to_file 函数中。如果你想使用那个功能。您需要将记录器对象作为参数传入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 2020-01-04
    • 2018-02-03
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多