blob: a92d4edacef221ef628047f53586cfeb3a8dcf87 [file] [log] [blame]
# Copyright (c) 2022 Nordic Semiconductor ASA
# SPDX-License-Identifier: Apache-2.0
'''
Common code used when logging that is needed by multiple modules.
'''
import logging
import os
import platform
import shlex
_WINDOWS = platform.system() == 'Windows'
def log_command(logger, msg, args):
'''Platform-independent helper for logging subprocess invocations.
Will log a command string that can be copy/pasted into a POSIX
shell on POSIX platforms. This is not available on Windows, so
the entire args array is logged instead.
:param logger: logging.Logger to use
:param msg: message to associate with the command
:param args: argument list as passed to subprocess module
'''
logger = logging.getLogger("twister")
logger.setLevel(logging.DEBUG)
msg = f'{msg}: %s'
if _WINDOWS:
logger.debug(msg, str(args))
else:
logger.debug(msg, shlex.join(args))
def setup_logging(outdir, log_file, log_level, timestamps):
logger = logging.getLogger("twister")
logger.setLevel(logging.DEBUG)
# create file handler which logs even debug messages
if log_file:
file_handler = logging.FileHandler(log_file)
else:
file_handler = logging.FileHandler(os.path.join(outdir, "twister.log"))
file_handler.setLevel(logging.DEBUG)
# create console handler with a higher log level
console_handler = logging.StreamHandler()
console_handler.setLevel(getattr(logging, log_level))
# create formatter and add it to the handlers
if timestamps:
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
else:
formatter = logging.Formatter("%(levelname)-7s - %(message)s")
formatter_file = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter_file)
# add the handlers to logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)
def close_logging():
logger = logging.getLogger("twister")
handlers = logger.handlers[:]
for handler in handlers:
logger.removeHandler(handler)
handler.close()
loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict]
for logg in loggers:
handls = logg.handlers[:]
for handl in handls:
logg.removeHandler(handl)
handl.close()