[英]How to set logging level in twisted?
我正在使用帶有twisted 的高速公路包,它在每次連接到websocket 時都會為我顯示調試消息。 我嘗試將日志記錄級別切換為 info 但沒有成功:
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)
我使用twisd腳本運行它: twisd -noy twisted_service.py然后我收到一條消息:
2018-03-03T10:45:22+0500 [內置.WebsocketService#debug] 啟動服務
logging.basicConfig 沒有幫助。
我找到了解決方案:
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)
要查找所有記錄器及其對應的名稱,請執行:
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)
我使用 kalombo 的答案為我自己的項目找出了一個解決方案,我將在這里分享內容,因為我找不到關於這個主題的太多可訪問的信息,而且我仍然需要弄清楚一些事情。 這個例子允許我們同時記錄到標准輸出和一個文件,並為每個選擇不同的日志級別。
(還要感謝https://stackoverflow.com/a/46651223/213445關於記錄到多個文件。)
這是細分:
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 中使用日志級別過濾,以及如何根據需要正確啟動和停止記錄器。
如其他一些答案所示,您需要創建一個綁定到日志文件對象的新“觀察者”,並使用“過濾器”來限制日志記錄級別。 如果您想啟動/停止/重新啟動 - 請注意,一旦 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 )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.