-# Copyright 2001-2019 by Vinay Sajip. All Rights Reserved.
+# Copyright 2001-2023 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
is based on PEP 282 and comments thereto in comp.lang.python, and influenced
by Apache's log4j system.
-Copyright (C) 2001-2019 Vinay Sajip. All Rights Reserved.
+Copyright (C) 2001-2023 Vinay Sajip. All Rights Reserved.
To use, simply 'import logging' and log away!
"""
c = config.pop('()')
if not callable(c):
c = self.resolve(c)
- props = config.pop('.', None)
# Check for valid identifiers
- kwargs = {k: config[k] for k in config if valid_ident(k)}
+ kwargs = {k: config[k] for k in config if (k != '.' and valid_ident(k))}
result = c(**kwargs)
+ props = config.pop('.', None)
if props:
for name, value in props.items():
setattr(result, name, value)
'address' in config:
config['address'] = self.as_tuple(config['address'])
factory = klass
- props = config.pop('.', None)
- kwargs = {k: config[k] for k in config if valid_ident(k)}
+ kwargs = {k: config[k] for k in config if (k != '.' and valid_ident(k))}
try:
result = factory(**kwargs)
except TypeError as te:
result.setLevel(logging._checkLevel(level))
if filters:
self.add_filters(result, filters)
+ props = config.pop('.', None)
if props:
for name, value in props.items():
setattr(result, name, value)
-# Copyright 2001-2022 by Vinay Sajip. All Rights Reserved.
+# Copyright 2001-2023 by Vinay Sajip. All Rights Reserved.
#
# Permission to use, copy, modify, and distribute this software and its
# documentation for any purpose and without fee is hereby granted,
"""Test harness for the logging module. Run all tests.
-Copyright (C) 2001-2022 Vinay Sajip. All Rights Reserved.
+Copyright (C) 2001-2023 Vinay Sajip. All Rights Reserved.
"""
import logging
},
}
+ class CustomFormatter(logging.Formatter):
+ custom_property = "."
+
+ def format(self, record):
+ return super().format(record)
+
+ config17 = {
+ 'version': 1,
+ 'formatters': {
+ "custom": {
+ "()": CustomFormatter,
+ "style": "{",
+ "datefmt": "%Y-%m-%d %H:%M:%S",
+ "format": "{message}", # <-- to force an exception when configuring
+ ".": {
+ "custom_property": "value"
+ }
+ }
+ },
+ 'handlers' : {
+ 'hand1' : {
+ 'class' : 'logging.StreamHandler',
+ 'formatter' : 'custom',
+ 'level' : 'NOTSET',
+ 'stream' : 'ext://sys.stdout',
+ },
+ },
+ 'root' : {
+ 'level' : 'WARNING',
+ 'handlers' : ['hand1'],
+ },
+ }
+
out_of_order = {
"version": 1,
"formatters": {
handler = logging.root.handlers[0]
self.addCleanup(cleanup, handler, fn)
+ def test_config17_ok(self):
+ self.apply_config(self.config17)
+ h = logging._handlers['hand1']
+ self.assertEqual(h.formatter.custom_property, 'value')
+
def setup_via_listener(self, text, verify=None):
text = text.encode("utf-8")
# Ask for a randomly assigned port (by using port 0)