|
1 | 1 | # Standard library |
2 | 2 | import logging |
3 | 3 | import os |
| 4 | +import sys |
4 | 5 | from datetime import datetime, timezone |
5 | 6 |
|
6 | 7 | # Third-party |
@@ -128,12 +129,50 @@ def paths_update(logger, paths, old_quarter, new_quarter): |
128 | 129 | return paths |
129 | 130 |
|
130 | 131 |
|
| 132 | +class ColoredFormatter(logging.Formatter): |
| 133 | + """Adds colors to log messages.""" |
| 134 | + # https://en.wikipedia.org/wiki/ANSI_escape_code#3-bit_and_4-bit |
| 135 | + COLORS = { |
| 136 | + logging.DEBUG: "\033[90m", # bright black |
| 137 | + logging.INFO: "\033[37m", # white |
| 138 | + logging.WARNING: "\033[93m", # bright yellow |
| 139 | + logging.ERROR: "\033[91m", # bright red |
| 140 | + logging.CRITICAL: "\033[31m", # red |
| 141 | + } |
| 142 | + RESET = "\033[0m" |
| 143 | + |
| 144 | + def format(self, record): |
| 145 | + message = super().format(record) |
| 146 | + color = self.COLORS.get(record.levelno, "") |
| 147 | + if color: |
| 148 | + return f"{color}{message}{self.RESET}" |
| 149 | + return message |
| 150 | + |
| 151 | + |
131 | 152 | def setup(current_file): |
132 | 153 | # Set up logging |
133 | | - logging.basicConfig( |
134 | | - level=logging.INFO, |
135 | | - format="%(asctime)s - %(levelname)s - %(module)s - %(message)s", |
| 154 | + root = logging.getLogger() |
| 155 | + root.handlers.clear() |
| 156 | + root.setLevel(logging.INFO) |
| 157 | + |
| 158 | + formatter = ColoredFormatter( |
| 159 | + "%(asctime)s - %(levelname)s - %(module)s - %(message)s" |
136 | 160 | ) |
| 161 | + |
| 162 | + # Info/warning to stdout |
| 163 | + stdout_handler = logging.StreamHandler(sys.stdout) |
| 164 | + stdout_handler.setLevel(logging.DEBUG) |
| 165 | + stdout_handler.setFormatter(formatter) |
| 166 | + stdout_handler.addFilter(lambda r: r.levelno < logging.ERROR) |
| 167 | + |
| 168 | + # Errors to stderr |
| 169 | + stderr_handler = logging.StreamHandler(sys.stderr) |
| 170 | + stderr_handler.setLevel(logging.ERROR) |
| 171 | + stderr_handler.setFormatter(formatter) |
| 172 | + |
| 173 | + root.addHandler(stdout_handler) |
| 174 | + root.addHandler(stderr_handler) |
| 175 | + |
137 | 176 | logger = logging.getLogger(__name__) |
138 | 177 |
|
139 | 178 | # Datetime |
|
0 commit comments