[Python] Remove obsolete logging callbacks (#33718)
Since #5024 there is a new logging callback working. The old code has
partially been removed in #4690, but never completely. Drop the old
logging code for good.
diff --git a/src/controller/python/ChipDeviceController-ScriptBinding.cpp b/src/controller/python/ChipDeviceController-ScriptBinding.cpp
index a55d386..728fd58 100644
--- a/src/controller/python/ChipDeviceController-ScriptBinding.cpp
+++ b/src/controller/python/ChipDeviceController-ScriptBinding.cpp
@@ -212,7 +212,6 @@
const char * pychip_Stack_ErrorToString(ChipError::StorageType err);
const char * pychip_Stack_StatusReportToString(uint32_t profileId, uint16_t statusCode);
-void pychip_Stack_SetLogFunct(LogMessageFunct logFunct);
PyChipError pychip_GetConnectedDeviceByNodeId(chip::Controller::DeviceCommissioner * devCtrl, chip::NodeId nodeId,
chip::Controller::Python::PyObject * context, DeviceAvailableFunc callback);
@@ -863,17 +862,6 @@
return 0;
}
-void pychip_Stack_SetLogFunct(LogMessageFunct logFunct)
-{
- // TODO: determine if log redirection is supposed to be functioning in CHIP
- //
- // Background: original log baseline supported 'redirect logs to this
- // function' however CHIP does not currently provide this.
- //
- // Ideally log redirection should work so that python code can do things
- // like using the log module.
-}
-
PyChipError pychip_DeviceController_PostTaskOnChipThread(ChipThreadTaskRunnerFunct callback, void * pythonContext)
{
if (callback == nullptr || pythonContext == nullptr)
diff --git a/src/controller/python/chip/ChipStack.py b/src/controller/python/chip/ChipStack.py
index beeaedd..06afff3 100644
--- a/src/controller/python/chip/ChipStack.py
+++ b/src/controller/python/chip/ChipStack.py
@@ -28,15 +28,11 @@
import asyncio
import builtins
-import logging
import os
-import sys
-import time
-from ctypes import CFUNCTYPE, Structure, c_bool, c_char_p, c_int64, c_uint8, c_uint16, c_uint32, c_void_p, py_object, pythonapi
+from ctypes import CFUNCTYPE, Structure, c_bool, c_char_p, c_uint16, c_uint32, c_void_p, py_object, pythonapi
from threading import Condition, Event, Lock
import chip.native
-from chip.logging import LOG_CATEGORY_AUTOMATION, LOG_CATEGORY_DETAIL, LOG_CATEGORY_ERROR, LOG_CATEGORY_PROGRESS
from chip.native import PyChipError
from .ChipUtility import ChipUtility
@@ -76,51 +72,6 @@
]
-class LogCategory(object):
- """Debug logging categories used by chip."""
-
- @staticmethod
- def categoryToLogLevel(cat):
- if cat == LOG_CATEGORY_ERROR:
- return logging.ERROR
- elif cat == LOG_CATEGORY_PROGRESS:
- return logging.INFO
- elif cat in (LOG_CATEGORY_DETAIL, LOG_CATEGORY_AUTOMATION):
- return logging.DEBUG
- else:
- return logging.NOTSET
-
-
-class ChipLogFormatter(logging.Formatter):
- """A custom logging.Formatter for logging chip library messages."""
-
- def __init__(
- self,
- datefmt=None,
- logModulePrefix=False,
- logLevel=False,
- logTimestamp=False,
- logMSecs=True,
- ):
- fmt = "%(message)s"
- if logModulePrefix:
- fmt = "CHIP:%(chip-module)s: " + fmt
- if logLevel:
- fmt = "%(levelname)s:" + fmt
- if datefmt is not None or logTimestamp:
- fmt = "%(asctime)s " + fmt
- super(ChipLogFormatter, self).__init__(fmt=fmt, datefmt=datefmt)
- self.logMSecs = logMSecs
-
- def formatTime(self, record, datefmt=None):
- if datefmt is None:
- timestampStr = time.strftime("%Y-%m-%d %H:%M:%S%z")
- if self.logMSecs:
- timestampUS = record.__dict__.get("timestamp-usec", 0)
- timestampStr = "%s.%03ld" % (timestampStr, timestampUS / 1000)
- return timestampStr
-
-
class AsyncCallableHandle:
def __init__(self, callback):
self._callback = callback
@@ -185,15 +136,12 @@
pythonapi.Py_DecRef(py_object(self))
-_LogMessageFunct = CFUNCTYPE(
- None, c_int64, c_int64, c_char_p, c_uint8, c_char_p)
_ChipThreadTaskRunnerFunct = CFUNCTYPE(None, py_object)
@_singleton
class ChipStack(object):
- def __init__(self, persistentStoragePath: str, installDefaultLogHandler=True,
- bluetoothAdapter=None, enableServerInteractions=True):
+ def __init__(self, persistentStoragePath: str, enableServerInteractions=True):
builtins.enableDebugMode = False
# TODO: Probably no longer necessary, see https://github.com/project-chip/connectedhomeip/issues/33321.
@@ -206,8 +154,6 @@
self.callbackRes = None
self.commissioningEventRes = None
self.openCommissioningWindowPincode = {}
- self._activeLogFunct = None
- self.addModulePrefixToLogMessage = True
self._enableServerInteractions = enableServerInteractions
#
@@ -216,50 +162,6 @@
#
self._loadLib()
- # Arrange to log output from the chip library to a python logger object with the
- # name 'chip.ChipStack'. If desired, applications can override this behavior by
- # setting self.logger to a different python logger object, or by calling setLogFunct()
- # with their own logging function.
- self.logger = logging.getLogger(__name__)
- self.setLogFunct(self.defaultLogFunct)
-
- # Determine if there are already handlers installed for the logger. Python 3.5+
- # has a method for this; on older versions the check has to be done manually.
- if hasattr(self.logger, "hasHandlers"):
- hasHandlers = self.logger.hasHandlers()
- else:
- hasHandlers = False
- logger = self.logger
- while logger is not None:
- if len(logger.handlers) > 0:
- hasHandlers = True
- break
- if not logger.propagate:
- break
- logger = logger.parent
-
- # If a logging handler has not already been initialized for 'chip.ChipStack',
- # or any one of its parent loggers, automatically configure a handler to log to
- # stdout. This maintains compatibility with a number of applications which expect
- # chip log output to go to stdout by default.
- #
- # This behavior can be overridden in a variety of ways:
- # - Initialize a different log handler before ChipStack is initialized.
- # - Pass installDefaultLogHandler=False when initializing ChipStack.
- # - Replace the StreamHandler on self.logger with a different handler object.
- # - Set a different Formatter object on the existing StreamHandler object.
- # - Reconfigure the existing ChipLogFormatter object.
- # - Configure chip to call an application-specific logging function by
- # calling self.setLogFunct().
- # - Call self.setLogFunct(None), which will configure the chip library
- # to log directly to stdout, bypassing python altogether.
- #
- if installDefaultLogHandler and not hasHandlers:
- logHandler = logging.StreamHandler(stream=sys.stdout)
- logHandler.setFormatter(ChipLogFormatter())
- self.logger.addHandler(logHandler)
- self.logger.setLevel(logging.DEBUG)
-
@_ChipThreadTaskRunnerFunct
def HandleChipThreadRun(callback):
callback()
@@ -292,49 +194,6 @@
def enableServerInteractions(self):
return self._enableServerInteractions
- @property
- def defaultLogFunct(self):
- """Returns a python callable which, when called, logs a message to the python logger object
- currently associated with the ChipStack object.
- The returned function is suitable for passing to the setLogFunct() method."""
-
- def logFunct(timestamp, timestampUSec, moduleName, logCat, message):
- moduleName = ChipUtility.CStringToString(moduleName)
- message = ChipUtility.CStringToString(message)
- if self.addModulePrefixToLogMessage:
- message = "CHIP:%s: %s" % (moduleName, message)
- logLevel = LogCategory.categoryToLogLevel(logCat)
- msgAttrs = {
- "chip-module": moduleName,
- "timestamp": timestamp,
- "timestamp-usec": timestampUSec,
- }
- self.logger.log(logLevel, message, extra=msgAttrs)
-
- return logFunct
-
- def setLogFunct(self, logFunct):
- """Set the function used by the chip library to log messages.
- The supplied object must be a python callable that accepts the following
- arguments:
- timestamp (integer)
- timestampUS (integer)
- module name (encoded UTF-8 string)
- log category (integer)
- message (encoded UTF-8 string)
- Specifying None configures the chip library to log directly to stdout."""
- if logFunct is None:
- logFunct = 0
- if not isinstance(logFunct, _LogMessageFunct):
- logFunct = _LogMessageFunct(logFunct)
- # TODO: Lock probably no longer necessary, see https://github.com/project-chip/connectedhomeip/issues/33321.
- with self.networkLock:
- # NOTE: ChipStack must hold a reference to the CFUNCTYPE object while it is
- # set. Otherwise it may get garbage collected, and logging calls from the
- # chip library will fail.
- self._activeLogFunct = logFunct
- self._ChipStackLib.pychip_Stack_SetLogFunct(logFunct)
-
def Shutdown(self):
#
# Terminate Matter thread and shutdown the stack.
@@ -484,9 +343,6 @@
self._ChipStackLib.pychip_Stack_StatusReportToString.restype = c_char_p
self._ChipStackLib.pychip_Stack_ErrorToString.argtypes = [c_uint32]
self._ChipStackLib.pychip_Stack_ErrorToString.restype = c_char_p
- self._ChipStackLib.pychip_Stack_SetLogFunct.argtypes = [
- _LogMessageFunct]
- self._ChipStackLib.pychip_Stack_SetLogFunct.restype = PyChipError
self._ChipStackLib.pychip_DeviceController_PostTaskOnChipThread.argtypes = [
_ChipThreadTaskRunnerFunct, py_object]