Skip to content

Commit 4d4bdae

Browse files
author
Peter Braun
committed
implemented logging and removed role and access code
1 parent a0dae19 commit 4d4bdae

File tree

2 files changed

+125
-0
lines changed

2 files changed

+125
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.venv
2+
.secop_ophyd
23
*.pyc
34
*.egg-info
45
.pytest_cache

src/secop_ophyd/logs.py

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import logging
2+
import sys
3+
from logging.handlers import RotatingFileHandler
4+
from pathlib import Path
5+
from typing import Optional
6+
7+
# Default configuration
8+
DEFAULT_LOG_LEVEL = logging.INFO
9+
DEFAULT_LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
10+
DEFAULT_LOG_DIR = ".secop-ophyd"
11+
DEFAULT_LOG_FILENAME = "secop-ophyd.log"
12+
DEFAULT_MAX_BYTES = 100 * 1024 * 1024 # 10 MB
13+
DEFAULT_BACKUP_COUNT = 5
14+
15+
# Create a dictionary of log level names to their values
16+
LOG_LEVELS = {
17+
"DEBUG": logging.DEBUG,
18+
"INFO": logging.INFO,
19+
"WARNING": logging.WARNING,
20+
"ERROR": logging.ERROR,
21+
"CRITICAL": logging.CRITICAL,
22+
}
23+
24+
25+
def setup_logging(
26+
name: str = "secop_ophyd",
27+
level: int = DEFAULT_LOG_LEVEL,
28+
log_format: str = DEFAULT_LOG_FORMAT,
29+
log_dir: Optional[str] = None,
30+
log_file: Optional[str] = None,
31+
max_bytes: int = DEFAULT_MAX_BYTES,
32+
backup_count: int = DEFAULT_BACKUP_COUNT,
33+
console: bool = False,
34+
) -> logging.Logger:
35+
"""
36+
Set up and configure a logger with rotating file handler.
37+
38+
Parameters:
39+
----------
40+
name : str
41+
Name of the logger
42+
level : int
43+
Logging level (default: INFO)
44+
log_format : str
45+
Format string for log messages
46+
log_dir : Optional[str]
47+
Directory to store log files (default: ~/.secop-ophyd/logs)
48+
log_file : Optional[str]
49+
Log file name (default: secop-ophyd.log)
50+
max_bytes : int
51+
Maximum size of log file before rotation (default: 10 MB)
52+
backup_count : int
53+
Number of backup files to keep (default: 5)
54+
console : bool
55+
Whether to also log to console (default: True)
56+
57+
Returns:
58+
-------
59+
logging.Logger
60+
Configured logger instance
61+
"""
62+
# Create logger
63+
logger = logging.getLogger(name)
64+
logger.setLevel(level)
65+
66+
# If handlers already exist, don't add more
67+
if logger.handlers:
68+
return logger
69+
70+
# Create formatter
71+
formatter = logging.Formatter(log_format)
72+
73+
# Set up log directory
74+
if log_dir is None:
75+
log_dir = DEFAULT_LOG_DIR
76+
77+
log_path = Path(log_dir)
78+
log_path.mkdir(parents=True, exist_ok=True)
79+
80+
# Set up log file path
81+
if log_file is None:
82+
log_file = DEFAULT_LOG_FILENAME
83+
84+
log_file_path = log_path / log_file
85+
86+
# Create rotating file handler
87+
file_handler = RotatingFileHandler(
88+
log_file_path, maxBytes=max_bytes, backupCount=backup_count
89+
)
90+
file_handler.setFormatter(formatter)
91+
logger.addHandler(file_handler)
92+
93+
# Add console handler if requested
94+
if console:
95+
console_handler = logging.StreamHandler(sys.stdout)
96+
console_handler.setFormatter(formatter)
97+
logger.addHandler(console_handler)
98+
99+
logger.info(f"Logging initialized: {log_file_path}")
100+
return logger
101+
102+
103+
def get_logger(name: str) -> logging.Logger:
104+
"""
105+
Get a logger by name. If the logger doesn't exist, it will be created
106+
with default settings.
107+
108+
Parameters:
109+
----------
110+
name : str
111+
Name of the logger
112+
113+
Returns:
114+
-------
115+
logging.Logger
116+
Logger instance
117+
"""
118+
logger = logging.getLogger(name)
119+
120+
# If the logger doesn't have handlers, set it up with defaults
121+
if not logger.handlers:
122+
return setup_logging(name)
123+
124+
return logger

0 commit comments

Comments
 (0)