Logging↲
The pyvesync library uses Python's standard logging module with the logger name pyvesync. The LibraryLogger class in pyvesync.utils.logs provides structured logging with automatic context (module and class name) and helper methods for API call logging.
pyvesync.utils.logs.LibraryLogger ↲
Library Logging Interface.
LibraryLogger provides a logging interface that automatically adds context (module and class name) and offers helper methods for structured logging, such as API call logs.
Attributes:
| Name | Type | Description |
|---|---|---|
debug |
bool
|
Class attribute to enable or disable debug logging, prints API requests & responses that return an error. |
shouldredact |
bool
|
Class attribute whether to redact sensitive information from logs. |
verbose |
bool
|
Class attribute to print all request & response content. |
Examples:
Logging an API call:
>>> LibraryLogger.log_api_call(logger, response)
2025-02-01 12:34:56 - DEBUG - my_library - ========API CALL========
API CALL to endpoint: /api/v1/resource
Method: POST
Request Headers:
{
REQUEST HEADERS
}
Request Body:
{
"key": "value"
}
Response Body:
{
RESPONSE BODY
}
Logging an API exception:
>>> LibraryLogger.log_api_exception(logger, request_dict, exception)
2025-02-01 12:34:56 - DEBUG - pyvesync -
Error in API CALL to endpoint: /api/v1/resource
Response Status: 500
Exception: <Exception>
Method: POST
Request Headers:
{
REQUEST HEADERS
}
Request Body:
{
"key": "value"
}
Attributes↲
debug_enabled
class-attribute
instance-attribute
↲
Class attribute to cache status of debug logging to avoid expensive calls.
shouldredact
class-attribute
instance-attribute
↲
Class attribute to determine if sensitive information should be redacted.
verbose
class-attribute
instance-attribute
↲
Class attribute to print all request & response content.
Functions↲
api_printer
classmethod
↲
Print the API dictionary in a readable format.
configure_file_logging
staticmethod
↲
configure_file_logging(
log_file: str | Path,
*,
level: str | int = INFO,
stdout: bool = True,
propagate: bool = False,
) -> None
Configure logging for pyvesync library.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
log_file
|
str | Path | None
|
The name of the file to log to. If None, logs will only be printed to the console. |
required |
level
|
str | int
|
The log level to set the logger to, can be
in form of enum |
INFO
|
stdout
|
bool
|
If True, log messages will also be printed to stdout. |
True
|
propagate
|
bool
|
If True, log messages will propagate to the root logger. |
False
|
Note
This method configures the pyvesync base logger and sets
propagation of log messages to the root logger based on the
propagate parameter.
error_device_response_code
classmethod
↲
error_device_response_code(
logger: Logger,
device: VeSyncBaseDevice,
method_name: str,
code: int | str,
msg: str,
) -> None
Log an error response from a device API call.
Use this log message to indicate that a device API call returned a response with an error.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
module logger |
required |
device
|
VeSyncBaseDevice
|
device instance |
required |
method_name
|
str
|
device method name |
required |
code
|
int | str
|
error code returned |
required |
msg
|
str
|
error message |
required |
error_device_response_content
classmethod
↲
error_device_response_content(
logger: Logger,
device: VeSyncBaseDevice,
method: str,
msg: str | None = None,
) -> None
Log an error parsing API response.
Use this log message to indicate that the API response is not in the expected format.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
module logger |
required |
device
|
VeSyncBaseDevice
|
device instance |
required |
method
|
str
|
method that caused the error |
required |
msg
|
str | None
|
optional description of error |
None
|
error_mashumaro_response
classmethod
↲
error_mashumaro_response(
logger: Logger,
method_name: str,
resp_dict: dict,
exc: MissingField
| InvalidFieldValue
| UnserializableField,
device: VeSyncBaseDevice | None = None,
) -> None
Log an error parsing API response.
Use this log message to indicate that the API response is not in the expected format.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
module logger |
required |
method_name
|
str
|
device name |
required |
resp_dict
|
dict
|
API response dictionary |
required |
exc
|
MissingField | InvalidFieldValue | UnserializableField
|
mashumaro exception caught |
required |
device
|
VeSyncBaseDevice | None
|
device if a device method was called |
None
|
is_json
staticmethod
↲
Check if the data is JSON formatted.
log_api_call
classmethod
↲
log_api_call(
logger: Logger,
response: ClientResponse,
response_body: bytes | None = None,
request_headers: dict | None = None,
request_body: str | dict | None = None,
) -> None
Log API calls in debug mode.
Logs an API call with a specific format that includes the endpoint, JSON-formatted headers, request body (if any) and response body.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
The logger instance to use. |
required |
response
|
ClientResponse
|
Requests response object from the API call. |
required |
response_body
|
bytes
|
The response body to log. |
None
|
request_headers
|
dict
|
The request headers to log. |
None
|
request_body
|
dict | str
|
The request body to log. |
None
|
Notes
This is a method used for the logging of API calls when the debug flag is enabled. The method logs the endpoint, method, request headers, request body (if any), response headers, and response body (if any).
log_api_exception
classmethod
↲
log_api_exception(
logger: Logger,
*,
exception: ClientResponseError,
request_body: dict | None,
) -> None
Log asyncio response exceptions.
Logs an API call with a specific format that includes the endpoint, JSON-formatted headers, request body (if any) and response body.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
The logger instance to use. |
required |
exception
|
ClientResponseError
|
KW only, The request body to log. |
required |
request_body
|
dict | None
|
KW only, The request body. |
required |
log_api_status_error
classmethod
↲
Log API response with non-200 status codes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
The logger instance to use. |
required |
response
|
ClientResponse
|
KW only, dictionary containing the request information. |
required |
log_device_return_code
classmethod
↲
log_device_return_code(
logger: Logger,
method: str,
device_name: str,
device_type: str,
error_info: ResponseInfo,
) -> None
Log return code from device API call.
When API responds with JSON, if the code key is not 0, it indicates an error has occurred.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
logger
|
Logger
|
module logger instance |
required |
method
|
str
|
method that caused the error |
required |
device_name
|
str
|
device name |
required |
device_type
|
str
|
device type |
required |
error_info
|
ResponseInfo
|
response info dataclass |
required |
redactor
classmethod
↲
Redact sensitive strings from debug output.
This method searches for specific sensitive keys in the input string and replaces their values with '##REDACTED##'. The keys that are redacted include:
- token
- authorizeCode
- password
- tk
- accountId
- authKey
- uuid
- cid
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
stringvalue
|
str
|
The input string potentially containing sensitive information. |
required |
Returns:
| Name | Type | Description |
|---|---|---|
str |
str
|
The redacted string with sensitive information replaced by '##REDACTED##'. |
set_log_level
staticmethod
↲
Set log level for logger to INFO.
try_json_loads
staticmethod
↲
Try to load JSON data.
Gracefully handle errors and return None if loading fails.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data
|
str | bytes | None
|
JSON data to load. |
required |
Returns:
| Type | Description |
|---|---|
dict | None
|
dict | None: Parsed JSON data or None if loading fails. |
Enabling Debug Logging↲
Debug logging can be enabled through the VeSync manager or directly via Python's logging module:
import logging
from pyvesync import VeSync
# Option 1: Set the pyvesync logger level directly
vs_logger = logging.getLogger("pyvesync")
vs_logger.setLevel(logging.DEBUG)
# Option 2: Use the manager's debug property
async with VeSync(username="EMAIL", password="PASSWORD") as manager:
manager.debug = True
Logging to a File↲
For verbose debugging, the manager provides a helper to log to a file:
async with VeSync(username="EMAIL", password="PASSWORD") as manager:
manager.log_to_file("debug.log", stdout=True)
# stdout=True will also print to the console
Redacting Sensitive Information↲
By default, the library redacts sensitive information (tokens, account IDs) from log output. This can be controlled via the redact parameter on the VeSync constructor or the redact property: