Skip to content

Commit ba7dfe8

Browse files
Add configurable logging
1 parent 4d142e3 commit ba7dfe8

File tree

3 files changed

+69
-18
lines changed

3 files changed

+69
-18
lines changed

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ dev = [
4141
"cachetools",
4242
"fastapi",
4343
"uvicorn",
44+
"graypy"
4445
]
4546

4647
[project.scripts]

src/daq_config_server/log.py

Lines changed: 65 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,72 @@
11
import logging
2+
from typing import Literal, TextIO
23

4+
from graypy import GELFTCPHandler
5+
from pydantic import BaseModel, HttpUrl
36

4-
# See https://github.com/DiamondLightSource/daq-config-server/issues/73
5-
# for making the logging configurable
6-
def get_default_logger(name: str = __name__) -> logging.Logger:
7-
logger = logging.getLogger(name)
8-
logger.setLevel(logging.INFO)
7+
LogLevel = Literal["NOTSET", "DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
98

10-
# Prevent adding handlers multiple times
11-
if not logger.handlers:
12-
console_handler = logging.StreamHandler()
13-
formatter = logging.Formatter(
14-
"%(asctime)s - %(levelname)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S"
15-
)
16-
console_handler.setFormatter(formatter)
17-
logger.addHandler(console_handler)
189

19-
return logger
10+
class GraylogConfig(BaseModel):
11+
enabled: bool = False
12+
url: HttpUrl = HttpUrl("http://localhost:5555")
2013

2114

22-
# For now use a basic console-writing logger. Integrate properly with kubernetes in the
23-
# future
24-
LOGGER = get_default_logger("daq-config-server")
15+
class LoggingConfig(BaseModel):
16+
level: LogLevel = "INFO"
17+
graylog: GraylogConfig = GraylogConfig()
18+
19+
20+
def set_up_stream_handler(
21+
logger: logging.Logger, logging_config: LoggingConfig
22+
) -> logging.StreamHandler[TextIO]:
23+
"""Creates and configures StreamHandler, then attaches to logger.
24+
25+
Args:
26+
logger: Logger to attach handler to
27+
logging_config: LoggingConfig
28+
"""
29+
stream_handler = logging.StreamHandler()
30+
stream_handler.setLevel(logging_config.level)
31+
32+
logger.addHandler(stream_handler)
33+
return stream_handler
34+
35+
36+
def set_up_graylog_handler(
37+
logger: logging.Logger, logging_config: LoggingConfig
38+
) -> GELFTCPHandler:
39+
"""Creates and configures GELFTCPHandler, then attaches to logger.
40+
41+
Args:
42+
logger: Logger to attach handler to
43+
logging_config: LoggingConfig
44+
"""
45+
assert logging_config.graylog.url.host is not None, "Graylog URL missing host"
46+
assert logging_config.graylog.url.port is not None, "Graylog URL missing port"
47+
graylog_handler = GELFTCPHandler(
48+
logging_config.graylog.url.host,
49+
logging_config.graylog.url.port,
50+
)
51+
graylog_handler.setLevel(logging_config.level)
52+
53+
logger.addHandler(graylog_handler)
54+
return graylog_handler
55+
56+
57+
def set_up_logging(logging_config: LoggingConfig) -> None:
58+
"""Configure root level logger for the config-server.
59+
60+
Configures root logger. Any other logger will propogate to this logger assuming the
61+
default `logger.propagate` is True.
62+
63+
Args:
64+
logging_config: LoggingConfig
65+
"""
66+
67+
logger = logging.getLogger()
68+
69+
logger.setLevel(logging_config.level)
70+
71+
if logging_config.graylog.enabled:
72+
set_up_graylog_handler(logger, logging_config)

src/daq_config_server/whitelist.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import atexit
2+
import logging
23
import time
34
from functools import cache
45
from pathlib import Path
@@ -11,7 +12,8 @@
1112
WHITELIST_REFRESH_RATE_S,
1213
WHITELIST_URL,
1314
)
14-
from daq_config_server.log import LOGGER
15+
16+
LOGGER = logging.getLogger(__name__)
1517

1618

1719
class WhitelistFetcher:

0 commit comments

Comments
 (0)