|
1 | 1 | import logging |
| 2 | +from typing import Literal, TextIO |
2 | 3 |
|
| 4 | +from graypy import GELFTCPHandler |
| 5 | +from pydantic import BaseModel, HttpUrl |
3 | 6 |
|
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"] |
9 | 8 |
|
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) |
18 | 9 |
|
19 | | - return logger |
| 10 | +class GraylogConfig(BaseModel): |
| 11 | + enabled: bool = False |
| 12 | + url: HttpUrl = HttpUrl("http://localhost:5555") |
20 | 13 |
|
21 | 14 |
|
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) |
0 commit comments