修改 python 包的现有记录器配置
Modifying existing logger configuration of a python package
我目前正在为我的项目使用 cvxpy
。当我解决优化问题时,我可以选择使用 prob.solve(solver=cvx.CVXOPT, verbose=True)
打开详细标志。当我这样做时,记录器开始将 DEBUG 级别的日志消息打印到控制台。
我理解是因为cvxpy
source code中的以下部分。
LOGGER = logging.getLogger("__cvxpy__")
LOGGER.propagate = False
LOGGER.setLevel(logging.INFO)
_stream_handler = logging.StreamHandler(sys.stdout)
_stream_handler.setLevel(logging.INFO)
_formatter = logging.Formatter(
fmt="(CVXPY) %(asctime)s: %(message)s", datefmt="%b %d %I:%M:%S %p"
)
_stream_handler.setFormatter(_formatter)
LOGGER.addHandler(_stream_handler)
如何在不破解原始源代码的情况下将消息重定向到文件?可以有一个setter方法吗? TIA
cvxpy 不提供任何将日志打印到文件的直接选项,而是使用 sys.stdout
.
但是,您可以将 sys.stdout
重定向到文件而不是控制台。为此,请参见:例如 Redirect stdout to a file in Python? or Temporarily Redirect stdout/stderr。
您在 .solve()
调用之前将输出重定向到程序中的一个文件中,它应该将日志打印到一个文件中。最简单的方法是 contextlib.redirect_stdout
这样当您使用 verbose=True
调用 solve
时,您提到的代码块中提到的 sys.stdout
将重定向到一个文件而不是控制台。如果您不熟悉 stdin、stdout 和 stderr,我建议您先快速阅读一下。
我目前正在为我的项目使用 cvxpy
。当我解决优化问题时,我可以选择使用 prob.solve(solver=cvx.CVXOPT, verbose=True)
打开详细标志。当我这样做时,记录器开始将 DEBUG 级别的日志消息打印到控制台。
我理解是因为cvxpy
source code中的以下部分。
LOGGER = logging.getLogger("__cvxpy__")
LOGGER.propagate = False
LOGGER.setLevel(logging.INFO)
_stream_handler = logging.StreamHandler(sys.stdout)
_stream_handler.setLevel(logging.INFO)
_formatter = logging.Formatter(
fmt="(CVXPY) %(asctime)s: %(message)s", datefmt="%b %d %I:%M:%S %p"
)
_stream_handler.setFormatter(_formatter)
LOGGER.addHandler(_stream_handler)
如何在不破解原始源代码的情况下将消息重定向到文件?可以有一个setter方法吗? TIA
cvxpy 不提供任何将日志打印到文件的直接选项,而是使用 sys.stdout
.
但是,您可以将 sys.stdout
重定向到文件而不是控制台。为此,请参见:例如 Redirect stdout to a file in Python? or Temporarily Redirect stdout/stderr。
您在 .solve()
调用之前将输出重定向到程序中的一个文件中,它应该将日志打印到一个文件中。最简单的方法是 contextlib.redirect_stdout
这样当您使用 verbose=True
调用 solve
时,您提到的代码块中提到的 sys.stdout
将重定向到一个文件而不是控制台。如果您不熟悉 stdin、stdout 和 stderr,我建议您先快速阅读一下。