-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path__init__.py
More file actions
116 lines (99 loc) · 3.26 KB
/
Copy path__init__.py
File metadata and controls
116 lines (99 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""
PySide_References - Project Level Initialization
Provides centralized loguru setup for consistent logging across all widgets.
"""
import sys
from pathlib import Path
from datetime import datetime
from loguru import logger
__version__ = "0.1.0"
__all__ = ["setup_project_logging", "logger"]
def setup_project_logging(
console_level="DEBUG",
file_level="DEBUG",
log_dir=None,
rotation="100 MB",
retention="10 files",
include_process_thread=True
):
"""
Setup project-wide logging configuration.
Args:
console_level: Console logging level
file_level: File logging level
log_dir: Directory for log files (defaults to ./logs)
rotation: When to rotate log files
retention: How many log files to keep
include_process_thread: Include process/thread info in console logs
Returns:
tuple: (console_handler_id, file_handler_id)
"""
# Remove any existing handlers
logger.remove()
# Setup log directory
if log_dir is None:
log_dir = Path.cwd() / "logs"
else:
log_dir = Path(log_dir)
log_dir.mkdir(exist_ok=True)
# Generate log filename
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
log_file = log_dir / f"pyside_widgets_{timestamp}.log"
# Filter for noisy libraries
def log_filter(record):
noisy_modules = {"urllib3", "matplotlib", "PIL", "asyncio", "websockets"}
module_root = record["name"].split(".")[0]
return module_root not in noisy_modules
# Console format
if include_process_thread:
console_format = (
"<level>{level: <8}</level> | "
"<level>{message}</level> | "
"<cyan>{name}</cyan>:<cyan>{function}</cyan> | "
"<green>{time:HH:mm:ss.SSS}</green> | "
"Process:{process.id};Thread:{thread.id}"
)
else:
console_format = (
"<level>{level: <8}</level> | "
"<level>{message}</level> | "
"<cyan>{name}</cyan>:<cyan>{function}</cyan> | "
"<green>{time:HH:mm:ss.SSS}</green>"
)
# Add console handler
console_id = logger.add(
sys.stdout,
format=console_format,
level=console_level,
colorize=True,
filter=log_filter,
enqueue=False, # Must be False for Jupyter compatibility
backtrace=True,
diagnose=True
)
# Add file handler
file_id = logger.add(
log_file,
format=(
"{time:YYYY-MM-DD HH:mm:ss.SSS} | "
"{level: <8} | "
"{process.id}:{thread.id} | "
"{name}:{function}:{line} | "
"{message}"
),
level=file_level,
rotation=rotation,
retention=retention,
compression="zip",
enqueue=True,
backtrace=True,
diagnose=True
)
logger.success(f"✓ Logging configured: {log_file.name}")
logger.info(f"📁 Log directory: {log_dir.absolute()}")
return console_id, file_id
# Optional: Auto-setup for notebooks
def setup_notebook_logging(**kwargs):
"""Convenience function for notebook usage with sensible defaults."""
kwargs.setdefault("include_process_thread", False)
return setup_project_logging(**kwargs)