You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Logging报错:name 'log' is not defined 求助

问题描述

我正在使用Python的logging模块将调试信息写入文件并输出到控制台,相关代码如下:

import logging
import sys

logger=logging.getLogger() 
logger.setLevel(logging.INFO)

file_handler = logging.FileHandler("std.log", mode='w')
file_handler.setFormatter(logging.Formatter('%(asctime)s %(message)s'))
logger.addHandler(file_handler)

logger.addHandler(logging.StreamHandler(stream=sys.stdout))

class MeuManipulador(logging.Handler):
    def emit(self, record):
        if record.levelno == logging.ERROR:
            log_entry = self.format(record)
            if "No such comm target registered" in str(record.msg):
                return
            log(mensagem = log_entry)    
logger.addHandler(MeuManipulador())

代码其余部分运行正常,调用logger.info或logger.warning的代码也能正常执行:

from sqlalchemy import text
from sqlalchemy.exc import ResourceClosedError
import time

logger.info('Dropando a tabela anterior')
with enginedb2 as conn:
    try:
        sql = ''' drop table DB2I023A.CNFC_CNV_HST_CTBL'''
        conn.execute(text(sql))
        conn.commit()
        logger.info(f'comando SQL {sql} executado com sucesso')
        time.sleep(1)
    except ResourceClosedError as error:
        logger.warning(f'comando SQL {sql} não foi executado com sucesso, resultando no erro : {error}')
        pass

但当调用logger.error时,出现如下报错:

---------------------------------------------------------------------------
ResourceClosedError                       Traceback (most recent call last)
File <timed exec>:5

File /projeto/libs/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1418, in Connection.execute(self, statement, parameters, execution_options)
   1417 else:
-> 1418     return meth(
   1419         self,
   1420         distilled_parameters,
   1421         execution_options or NO_OPTIONS,
   1422     )

File /projeto/libs/lib/python3.11/site-packages/sqlalchemy/sql/elements.py:515, in ClauseElement._execute_on_connection(self, connection, distilled_params, execution_options)
    514         assert isinstance(self, Executable)
-> 515     return connection._execute_clauseelement(
    516         self, distilled_params, execution_options
    517     )
    518 else:

File /projeto/libs/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1640, in Connection._execute_clauseelement(self, elem, distilled_parameters, execution_options)
   1632 compiled_sql, extracted_params, cache_hit = elem._compile_w_cache(
   1633     dialect=dialect,
   1634     compiled_cache=compiled_cache,
   (...)
   1638     linting=self.dialect.compiler_linting | compiler.WARN_LINTING,
   1639 )
-> 1640 ret = self._execute_context(
   1641     dialect,
   1642     dialect.execution_ctx_cls._init_compiled,
   1643     compiled_sql,
   1644     distilled_parameters,
   1645     execution_options,
   1646     compiled_sql,
   1647     distilled_parameters,
   1648     elem,
   1649     extracted_params,
   1650     cache_hit=cache_hit,
   1651 )
   1652 if has_events:

File /projeto/libs/lib/python3.11/site-packages/sqlalchemy/engine/base.py:1813, in Connection._execute_context(self, dialect, constructor, statement, parameters, execution_options, *args, **kw)
   1812 if conn is None:
-> 1813     conn = self._revalidate_connection()
   1815 context = constructor(
   1816     dialect, self, conn, execution_options, *args, **kw
   1817 )

File /projeto/libs/lib/python3.11/site-packages/sqlalchemy/engine/base.py:680, in Connection._revalidate_connection(self)
    679     return self._dbapi_connection
-> 680 raise exc.ResourceClosedError("This Connection is closed")

ResourceClosedError: This Connection is closed

During handling of the above exception, another exception occurred:

NameError                                 Traceback (most recent call last)
File <timed exec>:10

File /usr/local/lib/python3.11/logging/__init__.py:1518, in Logger.error(self, msg, *args, **kwargs)
   1509 """
   1510 Log 'msg % args' with severity 'ERROR'.
   1511 
   (...)
   1515 logger.error("Houston, we have a %s", "major problem", exc_info=1)
   1516 """
   1517 if self.isEnabledFor(ERROR):
-> 1518     self._log(ERROR, msg, args, **kwargs)

File /usr/local/lib/python3.11/logging/__init__.py:1634, in Logger._log(self, level, msg, args, exc_info, extra, stack_info, stacklevel)
   1631         exc_info = sys.exc_info()
   1632 record = self.makeRecord(self.name, level, fn, lno, msg, args,
   1633                          exc_info, func, extra, sinfo)
-> 1634 self.handle(record)

File /usr/local/lib/python3.11/logging/__init__.py:1644, in Logger.handle(self, record)
   1637 """
   1638 Call the handlers for the specified record.
   1639 
   1640 This method is used for unpickled records received from a socket, as
   1641 well as those created locally. Logger-level filtering is applied.
   1642 """
   1643 if (not self.disabled) and self.filter(record):
-> 1644     self.callHandlers(record)

File /usr/local/lib/python3.11/logging/__init__.py:1706, in Logger.callHandlers(self, record)
   1704     found = found + 1
   1705     if record.levelno >= hdlr.level:
-> 1706         hdlr.handle(record)
   1707 if not c.propagate:
   1708     c = None    #break out

File /usr/local/lib/python3.11/logging/__init__.py:978, in Handler.handle(self, record)
    976 self.acquire()
    977 try:
-> 978     self.emit(record)
    979 finally:
    980     self.release()

File <timed exec>:17, in emit(self, record)

NameError: name 'log' is not defined

请问有什么解决建议?使用logging.error有特殊要求吗?

解决建议
  • 核心问题:报错NameError: name 'log' is not defined是因为自定义的MeuManipulador类的emit方法中调用了未定义的log函数。只有触发ERROR级别日志时,这个自定义Handler的逻辑才会执行,所以仅调用logger.error时才会暴露该问题,和logging.error本身无关。
  • 修复方案:
    1. 如果log是自定义的日志函数,确保它在MeuManipulador的作用域内可访问——提前定义并导入,或是将其作为类属性传入。
    2. 若想复用当前logger实例,可替换为logger.error(log_entry),或是在Handler初始化时传入logger,通过self.logger调用。
    3. 如果是笔误,替换为正确的实现代码(比如写入特定存储、调用其他日志接口等)。
  • 额外优化:
    • 给自定义Handler设置日志级别,比如MeuManipulador().setLevel(logging.ERROR),避免处理非ERROR级别的日志。
    • 排查ResourceClosedError:该错误是触发logger.error的原因,需要检查数据库连接生命周期,比如with enginedb2 as conn块是否正确管理了连接状态。

内容的提问来源于stack exchange,提问作者FábioRB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:03:11