如何设置扭曲的日志记录级别?
How to set logging level in twisted?
我正在使用带有 twisted 的高速公路包,它会在每次连接到 websocket 时为我显示调试消息。我尝试将日志记录级别切换为信息但没有成功:
import logging
logging.basicConfig(level=logging.INFO)
是否有切换日志级别的简单方法?
已更新。
这里是 twisted_service.py:
from twisted.application import service
from twisted.logger import Logger
import logging
logging.basicConfig(level=logging.INFO)
class WebsocketService(service.Service):
log = Logger()
def startService(self):
service.Service.startService(self)
self.log.debug('start service')
application = service.Application("ws")
ws_service = WebsocketService()
ws_service.setServiceParent(application)
我 运行 它使用 twistd 脚本:twistd -noy twisted_service.py 我收到一条消息:
2018-03-03T10:45:22+0500 [builtin.WebsocketService#debug] start service
logging.basicConfig 没有帮助。
要查找所有记录器及其对应的名称,请执行:
logging.Logger.manager.loggerDict.keys()
尝试通过获取噪声记录器实例来明确设置它:
import logging
noisyLogger = logging.getLogger("autobahn") # adjust logger name
# noisyLogger.getEffectiveLevel() # indicates the current effective level
noisyLogger.setLevel(logging.INFO)
我找到了解决方案:
import sys
from twisted.application import service
from twisted.logger import LogLevelFilterPredicate, LogLevel
from twisted.logger import textFileLogObserver, FilteringLogObserver
class WebsocketService(service.Service):
log = Logger()
def startService(self):
service.Service.startService(self)
self.log.debug('start service')
application = service.Application("ws")
ws_service = WebsocketService()
ws_service.setServiceParent(application)
info_predicate = LogLevelFilterPredicate(LogLevel.info)
log_observer = FilteringLogObserver(textFileLogObserver(sys.stdout), predicates=info_predicate)
application.setComponent(ILogObserver, log_observer)
我使用 kalombo 的回答为我自己的项目找到了一个解决方案,我将在这里分享主要内容,因为我找不到关于这个主题的太多可用信息,而且我仍然需要找出一些事物。这个例子允许我们记录到标准输出和文件,并为每个选择不同的日志级别。
(还要感谢 关于记录到多个文件。)
细目如下:
- 变量“logtargets”是 FilteringLogObserver 实例的列表。
- 每个 FilteringLogObserver 包装一个 textFileLogObserver,并强加一个 LogLevelFilterPredicate。我们为标准输出执行一次,为我们的“日志文件”执行一次。
- LogLevelFilterPredicate 通过其“谓词”参数将 最大 LogLevel 传送给 FilteringLogObserver。
- FilteringLogObserver 的“谓词”参数必须是可迭代的,因此我们在传递时将 LogLevelFilterPredicate 包装在一个列表中。
- 最后,我们将“logtargets”列表传递给 globalLogBeginner.beginLoggingTo()。
- 所有未来的 Twisted Logger 实例都将指向我们的两个日志目标。
- 我们可以有多个 Logger 实例,一个用于我们程序的每个子系统,并且我们为每个实例提供一个参数,即来自该子系统的日志行的名称空间。
import sys
from twisted.logger import Logger, LogLevel, LogLevelFilterPredicate, \
textFileLogObserver, FilteringLogObserver, globalLogBeginner
logfile = open("application.log", 'a')
logtargets = []
# Set up the log observer for stdout.
logtargets.append(
FilteringLogObserver(
textFileLogObserver(sys.stdout),
predicates=[LogLevelFilterPredicate(LogLevel.warn)]
)
)
# Set up the log observer for our log file. "debug" is the highest possible level.
logtargets.append(
FilteringLogObserver(
textFileLogObserver(logfile),
predicates=[LogLevelFilterPredicate(LogLevel.debug)]
)
)
# Direct the Twisted Logger to log to both of our observers.
globalLogBeginner.beginLoggingTo(logtargets)
# Start a logger with a namespace for a particular subsystem of our application.
log = Logger("mynamespace")
log.warn("Goes to both outputs.") # Outputs will start with [mynamespace#warn]
log.error("Also go to both outputs; error is higher priority than warn.")
log.debug("Only goes to log file.")
log.info("Also only goes to log file; info is lower priority than warn.")
在这个示例片段中,我演示了将 Twisted 日志记录集成到另一个(自定义)日志系统(我省略了代码)的场景。在这种情况下,另一个记录器正在管理一个 file
对象、stdout/err 重定向、文件轮换等。我只是想让 Twisted 补充 那个系统和通过它有效地发送消息。
我在这里另外展示了如何在 Twisted 中使用日志级别过滤,以及如何根据需要正确启动和停止他们的记录器。
如其他一些答案所示,您需要创建一个绑定到日志文件对象的新“观察者”,并使用“过滤器”来限制日志记录级别。如果你想 start/stop/restart - 那么请注意,一旦 Twisted 日志记录之前被“启动”,你需要将该输出重定向到一个新文件(通过一个新的观察者),而不是再次“开始”他们的日志记录。如果您尝试多次“启动”Twisted 日志记录,这可以防止警告出现在日志中。
我还指出,如果观察者已被删除(或从未添加),调用 theLogPublisher.removeObserver
是无害的。因此,在停止后保持观察者引用实际上是一个简单的逻辑流程,尽管可能想将其设置为 None
- 即使这可能等同于某些情况下的微小“浪费”内存上下文。
from twisted.python import log as twistedlog
from twisted.logger import( FilteringLogObserver, textFileLogObserver,
LogLevelFilterPredicate, LogLevel )
twistedLogObserver = None
def startTwistedLogging( logFile, level, isStdMsgHdlr=False ):
global twistedLogObserver
observer = FilteringLogObserver( textFileLogObserver( logFile ),
predicates=[ LogLevelFilterPredicate( level ) ] )
if twistedLogObserver:
twistedlog.theLogPublisher.addObserver( observer )
else:
twistedlog.startLoggingWithObserver( observer, setStdout=isStdMsgHdlr )
twistedLogObserver = observer
def stopTwistedLogging():
if twistedLogObserver:
twistedlog.theLogPublisher.removeObserver( twistedLogObserver )
我正在使用带有 twisted 的高速公路包,它会在每次连接到 websocket 时为我显示调试消息。我尝试将日志记录级别切换为信息但没有成功:
import logging
logging.basicConfig(level=logging.INFO)
是否有切换日志级别的简单方法?
已更新。
这里是 twisted_service.py:
from twisted.application import service
from twisted.logger import Logger
import logging
logging.basicConfig(level=logging.INFO)
class WebsocketService(service.Service):
log = Logger()
def startService(self):
service.Service.startService(self)
self.log.debug('start service')
application = service.Application("ws")
ws_service = WebsocketService()
ws_service.setServiceParent(application)
我 运行 它使用 twistd 脚本:twistd -noy twisted_service.py 我收到一条消息:
2018-03-03T10:45:22+0500 [builtin.WebsocketService#debug] start service
logging.basicConfig 没有帮助。
要查找所有记录器及其对应的名称,请执行:
logging.Logger.manager.loggerDict.keys()
尝试通过获取噪声记录器实例来明确设置它:
import logging
noisyLogger = logging.getLogger("autobahn") # adjust logger name
# noisyLogger.getEffectiveLevel() # indicates the current effective level
noisyLogger.setLevel(logging.INFO)
我找到了解决方案:
import sys
from twisted.application import service
from twisted.logger import LogLevelFilterPredicate, LogLevel
from twisted.logger import textFileLogObserver, FilteringLogObserver
class WebsocketService(service.Service):
log = Logger()
def startService(self):
service.Service.startService(self)
self.log.debug('start service')
application = service.Application("ws")
ws_service = WebsocketService()
ws_service.setServiceParent(application)
info_predicate = LogLevelFilterPredicate(LogLevel.info)
log_observer = FilteringLogObserver(textFileLogObserver(sys.stdout), predicates=info_predicate)
application.setComponent(ILogObserver, log_observer)
我使用 kalombo 的回答为我自己的项目找到了一个解决方案,我将在这里分享主要内容,因为我找不到关于这个主题的太多可用信息,而且我仍然需要找出一些事物。这个例子允许我们记录到标准输出和文件,并为每个选择不同的日志级别。
(还要感谢
细目如下:
- 变量“logtargets”是 FilteringLogObserver 实例的列表。
- 每个 FilteringLogObserver 包装一个 textFileLogObserver,并强加一个 LogLevelFilterPredicate。我们为标准输出执行一次,为我们的“日志文件”执行一次。
- LogLevelFilterPredicate 通过其“谓词”参数将 最大 LogLevel 传送给 FilteringLogObserver。
- FilteringLogObserver 的“谓词”参数必须是可迭代的,因此我们在传递时将 LogLevelFilterPredicate 包装在一个列表中。
- 最后,我们将“logtargets”列表传递给 globalLogBeginner.beginLoggingTo()。
- 所有未来的 Twisted Logger 实例都将指向我们的两个日志目标。
- 我们可以有多个 Logger 实例,一个用于我们程序的每个子系统,并且我们为每个实例提供一个参数,即来自该子系统的日志行的名称空间。
import sys
from twisted.logger import Logger, LogLevel, LogLevelFilterPredicate, \
textFileLogObserver, FilteringLogObserver, globalLogBeginner
logfile = open("application.log", 'a')
logtargets = []
# Set up the log observer for stdout.
logtargets.append(
FilteringLogObserver(
textFileLogObserver(sys.stdout),
predicates=[LogLevelFilterPredicate(LogLevel.warn)]
)
)
# Set up the log observer for our log file. "debug" is the highest possible level.
logtargets.append(
FilteringLogObserver(
textFileLogObserver(logfile),
predicates=[LogLevelFilterPredicate(LogLevel.debug)]
)
)
# Direct the Twisted Logger to log to both of our observers.
globalLogBeginner.beginLoggingTo(logtargets)
# Start a logger with a namespace for a particular subsystem of our application.
log = Logger("mynamespace")
log.warn("Goes to both outputs.") # Outputs will start with [mynamespace#warn]
log.error("Also go to both outputs; error is higher priority than warn.")
log.debug("Only goes to log file.")
log.info("Also only goes to log file; info is lower priority than warn.")
在这个示例片段中,我演示了将 Twisted 日志记录集成到另一个(自定义)日志系统(我省略了代码)的场景。在这种情况下,另一个记录器正在管理一个 file
对象、stdout/err 重定向、文件轮换等。我只是想让 Twisted 补充 那个系统和通过它有效地发送消息。
我在这里另外展示了如何在 Twisted 中使用日志级别过滤,以及如何根据需要正确启动和停止他们的记录器。
如其他一些答案所示,您需要创建一个绑定到日志文件对象的新“观察者”,并使用“过滤器”来限制日志记录级别。如果你想 start/stop/restart - 那么请注意,一旦 Twisted 日志记录之前被“启动”,你需要将该输出重定向到一个新文件(通过一个新的观察者),而不是再次“开始”他们的日志记录。如果您尝试多次“启动”Twisted 日志记录,这可以防止警告出现在日志中。
我还指出,如果观察者已被删除(或从未添加),调用 theLogPublisher.removeObserver
是无害的。因此,在停止后保持观察者引用实际上是一个简单的逻辑流程,尽管可能想将其设置为 None
- 即使这可能等同于某些情况下的微小“浪费”内存上下文。
from twisted.python import log as twistedlog
from twisted.logger import( FilteringLogObserver, textFileLogObserver,
LogLevelFilterPredicate, LogLevel )
twistedLogObserver = None
def startTwistedLogging( logFile, level, isStdMsgHdlr=False ):
global twistedLogObserver
observer = FilteringLogObserver( textFileLogObserver( logFile ),
predicates=[ LogLevelFilterPredicate( level ) ] )
if twistedLogObserver:
twistedlog.theLogPublisher.addObserver( observer )
else:
twistedlog.startLoggingWithObserver( observer, setStdout=isStdMsgHdlr )
twistedLogObserver = observer
def stopTwistedLogging():
if twistedLogObserver:
twistedlog.theLogPublisher.removeObserver( twistedLogObserver )