Skip to content

Commit a7e2846

Browse files
nashifkartben
authored andcommitted
twister: setup logging per process
Setup logging per process to fix issue on both mac and windows where handlers are not available to the processes. Fixes #86237 Signed-off-by: Anas Nashif <[email protected]>
1 parent 3a996c5 commit a7e2846

File tree

4 files changed

+45
-33
lines changed

4 files changed

+45
-33
lines changed

scripts/pylib/twister/twisterlib/log_helper.py

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,16 @@
55
Common code used when logging that is needed by multiple modules.
66
'''
77

8+
import logging
9+
import os
810
import platform
911
import shlex
1012

11-
_WINDOWS = (platform.system() == 'Windows')
13+
_WINDOWS = platform.system() == 'Windows'
14+
15+
16+
logger = logging.getLogger("twister")
17+
logger.setLevel(logging.DEBUG)
1218

1319
def log_command(logger, msg, args):
1420
'''Platform-independent helper for logging subprocess invocations.
@@ -25,3 +31,32 @@ def log_command(logger, msg, args):
2531
logger.debug(msg, str(args))
2632
else:
2733
logger.debug(msg, shlex.join(args))
34+
35+
def setup_logging(outdir, log_file, log_level, timestamps):
36+
# create file handler which logs even debug messages
37+
if log_file:
38+
file_handler = logging.FileHandler(log_file)
39+
else:
40+
file_handler = logging.FileHandler(os.path.join(outdir, "twister.log"))
41+
42+
file_handler.setLevel(logging.DEBUG)
43+
44+
# create console handler with a higher log level
45+
console_handler = logging.StreamHandler()
46+
console_handler.setLevel(getattr(logging, log_level))
47+
48+
# create formatter and add it to the handlers
49+
if timestamps:
50+
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
51+
else:
52+
formatter = logging.Formatter("%(levelname)-7s - %(message)s")
53+
54+
formatter_file = logging.Formatter(
55+
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
56+
)
57+
console_handler.setFormatter(formatter)
58+
file_handler.setFormatter(formatter_file)
59+
60+
# add the handlers to logger
61+
logger.addHandler(console_handler)
62+
logger.addHandler(file_handler)

scripts/pylib/twister/twisterlib/runner.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
from twisterlib.cmakecache import CMakeCache
3030
from twisterlib.environment import canonical_zephyr_base
3131
from twisterlib.error import BuildError, ConfigurationError, StatusAttributeError
32+
from twisterlib.log_helper import setup_logging
3233
from twisterlib.statuses import TwisterStatus
3334

3435
if version.parse(elftools.__version__) < version.parse('0.24'):
@@ -978,7 +979,9 @@ def process(self, pipeline, done, message, lock, results):
978979
additionals = {}
979980

980981
op = message.get('op')
981-
982+
options = self.options
983+
if not logger.handlers:
984+
setup_logging(options.outdir, options.log_file, options.log_level, options.timestamps)
982985
self.instance.setup_handler(self.env)
983986

984987
if op == "filter":

scripts/pylib/twister/twisterlib/twister_main.py

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from twisterlib.coverage import run_coverage
1616
from twisterlib.environment import TwisterEnv
1717
from twisterlib.hardwaremap import HardwareMap
18+
from twisterlib.log_helper import setup_logging
1819
from twisterlib.package import Artifacts
1920
from twisterlib.reports import Reporting
2021
from twisterlib.runner import TwisterRunner
@@ -24,37 +25,6 @@
2425
logger = logging.getLogger("twister")
2526
logger.setLevel(logging.DEBUG)
2627

27-
28-
def setup_logging(outdir, log_file, log_level, timestamps):
29-
# create file handler which logs even debug messages
30-
if log_file:
31-
file_handler = logging.FileHandler(log_file)
32-
else:
33-
file_handler = logging.FileHandler(os.path.join(outdir, "twister.log"))
34-
35-
file_handler.setLevel(logging.DEBUG)
36-
37-
# create console handler with a higher log level
38-
console_handler = logging.StreamHandler()
39-
console_handler.setLevel(getattr(logging, log_level))
40-
41-
# create formatter and add it to the handlers
42-
if timestamps:
43-
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
44-
else:
45-
formatter = logging.Formatter("%(levelname)-7s - %(message)s")
46-
47-
formatter_file = logging.Formatter(
48-
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
49-
)
50-
console_handler.setFormatter(formatter)
51-
file_handler.setFormatter(formatter_file)
52-
53-
# add the handlers to logger
54-
logger.addHandler(console_handler)
55-
logger.addHandler(file_handler)
56-
57-
5828
def init_color(colorama_strip):
5929
colorama.init(strip=colorama_strip)
6030

scripts/tests/twister/test_runner.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1482,6 +1482,7 @@ def mock_getsize(filename, *args, **kwargs):
14821482
def test_projectbuilder_process(
14831483
caplog,
14841484
mocked_jobserver,
1485+
tmp_path,
14851486
message,
14861487
instance_status,
14871488
instance_reason,
@@ -1529,6 +1530,9 @@ def mock_determine_testcases(res):
15291530
pb.options.prep_artifacts_for_testing = options_prep_artifacts
15301531
pb.options.runtime_artifact_cleanup = options_runtime_artifacts
15311532
pb.options.cmake_only = options_cmake_only
1533+
pb.options.outdir = tmp_path
1534+
pb.options.log_file = None
1535+
pb.options.log_level = "DEBUG"
15321536

15331537
pb.cmake = mock.Mock(return_value=cmake_res)
15341538
pb.build = mock.Mock(return_value=build_res)

0 commit comments

Comments
 (0)