|
1 | 1 | import json |
2 | 2 | import logging |
3 | 3 | import os |
| 4 | +import re |
4 | 5 | import signal |
5 | 6 | import subprocess |
6 | 7 | import sys |
@@ -227,7 +228,33 @@ def call_script(script, args=(), log_dest=None): |
227 | 228 | base_dir = os.path.realpath(os.path.dirname(__file__) + "/..") |
228 | 229 | cmd = base + ("{}/{}".format(base_dir, script),) + tuple(map(str, args)) |
229 | 230 | logger.debug("Running {}".format(cmd)) |
230 | | - return command_runner(cmd, **kwargs) |
| 231 | + exit_code, output = command_runner(cmd, **kwargs) |
| 232 | + |
| 233 | + if log_dest is LogOutput.LOGGER: |
| 234 | + if output: |
| 235 | + for line in output.splitlines(): |
| 236 | + level = infer_log_level(line) |
| 237 | + logger.log(level, line) |
| 238 | + |
| 239 | + return exit_code, output |
| 240 | + |
| 241 | + |
| 242 | +def infer_log_level(line): |
| 243 | + """Infer log level from a log line.""" |
| 244 | + upper_line = line.upper() |
| 245 | + |
| 246 | + if re.match(r"^\s*(\[)?(CRITICAL|FATAL)(]|:|\s|-)", upper_line): |
| 247 | + return logging.CRITICAL |
| 248 | + elif re.match(r"^\s*(\[)?(ERROR|ERR)(]|:|\s|-)", upper_line): |
| 249 | + return logging.ERROR |
| 250 | + elif re.match(r"^\s*(\[)?(WARN|WARNING)(]|:|\s|-)", upper_line): |
| 251 | + return logging.WARNING |
| 252 | + elif re.match(r"^\s*(\[)?(INFO|INFORMATION)(]|:|\s|-)", upper_line): |
| 253 | + return logging.INFO |
| 254 | + elif re.match(r"^\s*(\[)?(DEBUG|TRACE)(]|:|\s|-)", upper_line): |
| 255 | + return logging.DEBUG |
| 256 | + |
| 257 | + return logging.INFO |
231 | 258 |
|
232 | 259 |
|
233 | 260 | class DB: |
|
0 commit comments