• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

localstack / localstack / 22048723723

13 Feb 2026 06:59PM UTC coverage: 87.006% (+0.1%) from 86.883%
22048723723

push

github

web-flow
CW Logs: Test suite for service internalization (#13692)

22 of 22 new or added lines in 1 file covered. (100.0%)

928 existing lines in 33 files now uncovered.

69716 of 80128 relevant lines covered (87.01%)

0.87 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

65.63
/localstack-core/localstack/logging/setup.py
1
import logging
1✔
2
import sys
1✔
3
import warnings
1✔
4

5
from localstack import config, constants
1✔
6

7
from ..utils.strings import key_value_pairs_to_dict
1✔
8
from .format import AddFormattedAttributes, DefaultFormatter
1✔
9

10
# The log levels for modules are evaluated incrementally for logging granularity,
11
# from highest (DEBUG) to lowest (TRACE_INTERNAL). Hence, each module below should have
12
# higher level which serves as the default.
13

14
default_log_levels = {
1✔
15
    "asyncio": logging.INFO,
16
    "boto3": logging.INFO,
17
    "botocore": logging.ERROR,
18
    "docker": logging.WARNING,
19
    "elasticsearch": logging.ERROR,
20
    "hpack": logging.ERROR,
21
    "moto": logging.WARNING,
22
    "requests": logging.WARNING,
23
    "s3transfer": logging.INFO,
24
    "urllib3": logging.WARNING,
25
    "werkzeug": logging.WARNING,
26
    "rolo": logging.WARNING,
27
    "parse": logging.WARNING,
28
    "localstack.aws.accounts": logging.INFO,
29
    "localstack.aws.protocol.serializer": logging.INFO,
30
    "localstack.aws.serving.wsgi": logging.WARNING,
31
    "localstack.request": logging.INFO,
32
    "localstack.request.internal": logging.WARNING,
33
    "localstack.state.inspect": logging.INFO,
34
    "localstack_persistence": logging.INFO,
35
}
36

37
trace_log_levels = {
1✔
38
    "rolo": logging.DEBUG,
39
    "localstack.aws.protocol.serializer": logging.DEBUG,
40
    "localstack.aws.serving.wsgi": logging.DEBUG,
41
    "localstack.request": logging.DEBUG,
42
    "localstack.request.internal": logging.INFO,
43
    "localstack.state.inspect": logging.DEBUG,
44
}
45

46
trace_internal_log_levels = {
1✔
47
    "localstack.aws.accounts": logging.DEBUG,
48
    "localstack.request.internal": logging.DEBUG,
49
}
50

51

52
def setup_logging_for_cli(log_level=logging.INFO):
1✔
UNCOV
53
    logging.basicConfig(level=log_level)
×
54

55
    # set log levels of loggers
UNCOV
56
    logging.root.setLevel(log_level)
×
UNCOV
57
    logging.getLogger("localstack").setLevel(log_level)
×
UNCOV
58
    for logger, level in default_log_levels.items():
×
UNCOV
59
        logging.getLogger(logger).setLevel(level)
×
60

61

62
def get_log_level_from_config():
1✔
63
    # overriding the log level if LS_LOG has been set
64
    if config.LS_LOG:
1✔
65
        log_level = str(config.LS_LOG).upper()
×
66
        if log_level.lower() in constants.TRACE_LOG_LEVELS:
×
67
            log_level = "DEBUG"
×
68
        log_level = logging._nameToLevel[log_level]
×
69
        return log_level
×
70

71
    return logging.DEBUG if config.DEBUG else logging.INFO
1✔
72

73

74
def setup_logging_from_config():
1✔
75
    log_level = get_log_level_from_config()
1✔
76
    setup_logging(log_level)
1✔
77

78
    if config.is_trace_logging_enabled():
1✔
79
        for name, level in trace_log_levels.items():
×
80
            logging.getLogger(name).setLevel(level)
×
81
    if config.LS_LOG == constants.LS_LOG_TRACE_INTERNAL:
1✔
82
        for name, level in trace_internal_log_levels.items():
×
83
            logging.getLogger(name).setLevel(level)
×
84

85
    raw_logging_override = config.LOG_LEVEL_OVERRIDES
1✔
86
    if raw_logging_override:
1✔
87
        logging_overrides = key_value_pairs_to_dict(raw_logging_override)
×
88
        for logger, level_name in logging_overrides.items():
×
89
            level = getattr(logging, level_name, None)
×
90
            if not level:
×
91
                raise ValueError(
×
92
                    f"Failed to configure logging overrides ({raw_logging_override}): '{level_name}' is not a valid log level"
93
                )
94
            logging.getLogger(logger).setLevel(level)
×
95

96

97
def create_default_handler(log_level: int):
1✔
98
    log_handler = logging.StreamHandler(stream=sys.stderr)
1✔
99
    log_handler.setLevel(log_level)
1✔
100
    log_handler.setFormatter(DefaultFormatter())
1✔
101
    log_handler.addFilter(AddFormattedAttributes())
1✔
102
    return log_handler
1✔
103

104

105
def setup_logging(log_level=logging.INFO) -> None:
1✔
106
    """
107
    Configures the python logging environment for LocalStack.
108

109
    :param log_level: the optional log level.
110
    """
111
    # set create a default handler for the root logger (basically logging.basicConfig but explicit)
112
    log_handler = create_default_handler(log_level)
1✔
113

114
    # replace any existing handlers
115
    logging.basicConfig(level=log_level, handlers=[log_handler])
1✔
116

117
    # disable some logs and warnings
118
    warnings.filterwarnings("ignore")
1✔
119
    logging.captureWarnings(True)
1✔
120

121
    # set log levels of loggers
122
    logging.root.setLevel(log_level)
1✔
123
    logging.getLogger("localstack").setLevel(log_level)
1✔
124
    for logger, level in default_log_levels.items():
1✔
125
        logging.getLogger(logger).setLevel(level)
1✔
126

127

128
def setup_hypercorn_logger(hypercorn_config) -> None:
1✔
129
    """
130
    Sets the hypercorn loggers, which are created in a peculiar way, to the localstack settings.
131

132
    :param hypercorn_config: a hypercorn.Config object
133
    """
134
    logger = hypercorn_config.log.access_logger
1✔
135
    if logger:
1✔
136
        logger.handlers[0].addFilter(AddFormattedAttributes())
×
137
        logger.handlers[0].setFormatter(DefaultFormatter())
×
138

139
    logger = hypercorn_config.log.error_logger
1✔
140
    if logger:
1✔
141
        logger.handlers[0].addFilter(AddFormattedAttributes())
1✔
142
        logger.handlers[0].setFormatter(DefaultFormatter())
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc