Source code for duck.contrib.websockets.logging
"""
Logging module for websockets.
"""
from typing import Optional, List, Union
from duck.http.request import HttpRequest
from duck.utils.dateutils import (
django_short_local_date,
short_local_date,
)
from duck.settings import SETTINGS
from duck.logging import logger
[docs]
def get_django_formatted_log(
request: Optional[HttpRequest] = None,
debug_message: Optional[Union[str, List[str]]] = None,
) -> str:
"""
Returns a log message formatted similarly to Django logs with color support.
Useful for logging WebSockets messages.
Args:
request (Optional[HttpRequest]): The HTTP request object. Optional, used for adding more detailed log information.
debug_message (Optional[Union[str, List[str]]]): A custom debug message or a list of messages to append to the log.
Returns:
str: The formatted log message with color code.
"""
# Initialize variables
debug_message = debug_message or ""
reset = logger.Style.RESET_ALL
color = logger.Fore.CYAN
# Add the main log information
if isinstance(debug_message, list):
first_msg = debug_message[0]
info = ""
debug_messages = debug_message[1:]
# Add second to last message on top before the first message.
info += "\n".join(debug_messages)
info += (
f"[{django_short_local_date()}] {color}" + f"{first_msg}"
)
else:
info = (
f"[{django_short_local_date()}] {color}" + f"{debug_message}"
)
return info + reset # Restore default color
[docs]
def get_duck_formatted_log(
request: Optional[HttpRequest] = None,
debug_message: Optional[Union[str, List[str]]] = None ,
) -> str:
"""
This returns default duck formatted log with color support.
Useful for logging WebSockets messages.
Args:
request (Optional[HttpRequest]): The http request object.
debug_message (Optional[Union[str, List[str]]]): Custom debug message or a list of messages to add to log.
"""
debug_message = debug_message or ""
reset = logger.Style.RESET_ALL
color = logger.Fore.CYAN
addr = ("unknown", "unknown")
if request and request.client_address:
addr = request.client_address
if isinstance(debug_message, list):
# List of messages
first_msg = debug_message[0]
info = (
f'[{short_local_date()}] {color}{first_msg}'
)
debug_messages = debug_message[1:]
for msg in debug_messages:
info += f"\n {reset}├── {msg} "
else:
info = (
f'[{short_local_date()}] {color}{debug_message}'
)
info += f"\n {reset}└── ADDR {list(addr)} "
return info + reset # Restore default color (default)
[docs]
def log_message(
request: Optional[HttpRequest] = None,
debug_message: Optional[Union[str, List[str]]] = None,
) -> None:
"""
Logs a WebSocket message to the console.
Args:
request (Optional[Request]): The http request object.
debug_message (Optional[Union[str, List[str]]]): Custom message or list of messages to display.
"""
logdata = ""
if SETTINGS["USE_DJANGO"]:
if SETTINGS['PREFERRED_LOG_STYLE'] == "duck":
logdata = get_duck_formatted_log(request, debug_message)
# Add newline to separate requests for duck formatted logs
logdata += "\n"
else:
logdata = get_django_formatted_log(request, debug_message)
else:
if SETTINGS['PREFERRED_LOG_STYLE'] == "django":
logdata = get_django_formatted_log(request, debug_message)
else:
logdata = get_duck_formatted_log(request, debug_message)
# Add newline to separate requests for duck formatted logs
logdata += "\n"
# Log response, use_colors=False to because logdata already has colors
logger.log_raw(logdata, use_colors=False)