簡體   English   中英

如何在扭曲中設置日志記錄級別?

[英]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關於記錄到多個文件。)

這是細分:

  • 變量“logtargets”是 FilteringLogObserver 實例的列表。
  • 每個 FilteringLogObserver 包裝一個 textFileLogObserver,並施加一個 LogLevelFilterPredicate。 我們為 stdout 執行一次,為我們的“日志文件”執行一次。
  • 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 中使用日志級別過濾,以及如何根據需要正確啟動和停止記錄器。

如其他一些答案所示,您需要創建一個綁定到日志文件對象的新“觀察者”,並使用“過濾器”來限制日志記錄級別。 如果您想啟動/停止/重新啟動 - 請注意,一旦 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM