Skip to content
Closed
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions daft/logging.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import logging
import typing
from pathlib import Path

from daft import refresh_logger

Expand Down Expand Up @@ -39,6 +40,7 @@ def setup_logger(
daft_only: bool = False,
logformat: str = "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt: str = "%Y-%m-%d %H:%M:%S.%s".format(),
log_path: str | None = None,
) -> None:
"""Setup Daft logger with a specific log level, optional prefix filtering, and Rust sync.

Expand All @@ -48,6 +50,7 @@ def setup_logger(
daft_only (bool, optional): Whether to only log messages from the Daft module. Defaults to False.
logformat (str, optional): The log format to use. Defaults to "%(asctime)s - %(name)s - %(levelname)s - %(message)s".
datefmt (str, optional): The date format to use. Defaults to '%Y-%m-%d %H:%M:%S.%s'.format().
log_path (str | None, optional): Path to a log file to append Daft logs to. If None, logs are only emitted to the configured stream handlers. Defaults to None.

Raises:
ValueError: If the log level is not valid.
Expand All @@ -68,6 +71,22 @@ def setup_logger(

for handler in root_logger.handlers:
handler.filters.clear()
# remove daft managed file handler if present
if isinstance(handler, _DaftFileHandler):
root_logger.removeHandler(handler)
handler.close()

if log_path is not None:
path = Path(log_path)
if "~" in str(path):
path = path.expanduser()
path = path.resolve()
path.parent.mkdir(parents=True, exist_ok=True)

file_handler = _DaftFileHandler(path)
file_handler.setLevel(numeric_level)
file_handler.setFormatter(logging.Formatter(logformat, datefmt=datefmt))
root_logger.addHandler(file_handler)

if daft_only:
for handler in root_logger.handlers:
Expand All @@ -79,3 +98,7 @@ def setup_logger(
handler.addFilter(lambda r, p=prefix: not r.name.startswith(p)) # type: ignore

refresh_logger()


class _DaftFileHandler(logging.FileHandler):
pass
Loading