summaryrefslogtreecommitdiffstats
path: root/contrib/tools/python3/src/Lib/logging
diff options
context:
space:
mode:
authorshadchin <[email protected]>2022-04-18 12:39:32 +0300
committershadchin <[email protected]>2022-04-18 12:39:32 +0300
commitd4be68e361f4258cf0848fc70018dfe37a2acc24 (patch)
tree153e294cd97ac8b5d7a989612704a0c1f58e8ad4 /contrib/tools/python3/src/Lib/logging
parent260c02f5ccf242d9d9b8a873afaf6588c00237d6 (diff)
IGNIETFERRO-1816 Update Python 3 from 3.9.12 to 3.10.4
ref:9f96be6d02ee8044fdd6f124b799b270c20ce641
Diffstat (limited to 'contrib/tools/python3/src/Lib/logging')
-rw-r--r--contrib/tools/python3/src/Lib/logging/__init__.py75
-rw-r--r--contrib/tools/python3/src/Lib/logging/config.py5
-rw-r--r--contrib/tools/python3/src/Lib/logging/handlers.py11
3 files changed, 69 insertions, 22 deletions
diff --git a/contrib/tools/python3/src/Lib/logging/__init__.py b/contrib/tools/python3/src/Lib/logging/__init__.py
index 1ab35a8c21a..19bd2bc20b2 100644
--- a/contrib/tools/python3/src/Lib/logging/__init__.py
+++ b/contrib/tools/python3/src/Lib/logging/__init__.py
@@ -198,7 +198,8 @@ def _checkLevel(level):
raise ValueError("Unknown level: %r" % level)
rv = _nameToLevel[level]
else:
- raise TypeError("Level not an integer or a valid string: %r" % level)
+ raise TypeError("Level not an integer or a valid string: %r"
+ % (level,))
return rv
#---------------------------------------------------------------------------
@@ -415,8 +416,9 @@ class PercentStyle(object):
asctime_search = '%(asctime)'
validation_pattern = re.compile(r'%\(\w+\)[#0+ -]*(\*|\d+)?(\.(\*|\d+))?[diouxefgcrsa%]', re.I)
- def __init__(self, fmt):
+ def __init__(self, fmt, *, defaults=None):
self._fmt = fmt or self.default_format
+ self._defaults = defaults
def usesTime(self):
return self._fmt.find(self.asctime_search) >= 0
@@ -427,7 +429,11 @@ class PercentStyle(object):
raise ValueError("Invalid format '%s' for '%s' style" % (self._fmt, self.default_format[0]))
def _format(self, record):
- return self._fmt % record.__dict__
+ if defaults := self._defaults:
+ values = defaults | record.__dict__
+ else:
+ values = record.__dict__
+ return self._fmt % values
def format(self, record):
try:
@@ -445,7 +451,11 @@ class StrFormatStyle(PercentStyle):
field_spec = re.compile(r'^(\d+|\w+)(\.\w+|\[[^]]+\])*$')
def _format(self, record):
- return self._fmt.format(**record.__dict__)
+ if defaults := self._defaults:
+ values = defaults | record.__dict__
+ else:
+ values = record.__dict__
+ return self._fmt.format(**values)
def validate(self):
"""Validate the input format, ensure it is the correct string formatting style"""
@@ -471,8 +481,8 @@ class StringTemplateStyle(PercentStyle):
asctime_format = '${asctime}'
asctime_search = '${asctime}'
- def __init__(self, fmt):
- self._fmt = fmt or self.default_format
+ def __init__(self, *args, **kwargs):
+ super().__init__(*args, **kwargs)
self._tpl = Template(self._fmt)
def usesTime(self):
@@ -494,7 +504,11 @@ class StringTemplateStyle(PercentStyle):
raise ValueError('invalid format: no fields')
def _format(self, record):
- return self._tpl.substitute(**record.__dict__)
+ if defaults := self._defaults:
+ values = defaults | record.__dict__
+ else:
+ values = record.__dict__
+ return self._tpl.substitute(**values)
BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"
@@ -550,7 +564,8 @@ class Formatter(object):
converter = time.localtime
- def __init__(self, fmt=None, datefmt=None, style='%', validate=True):
+ def __init__(self, fmt=None, datefmt=None, style='%', validate=True, *,
+ defaults=None):
"""
Initialize the formatter with specified format strings.
@@ -569,7 +584,7 @@ class Formatter(object):
if style not in _STYLES:
raise ValueError('Style must be one of: %s' % ','.join(
_STYLES.keys()))
- self._style = _STYLES[style][0](fmt)
+ self._style = _STYLES[style][0](fmt, defaults=defaults)
if validate:
self._style.validate()
@@ -863,6 +878,7 @@ class Handler(Filterer):
self._name = None
self.level = _checkLevel(level)
self.formatter = None
+ self._closed = False
# Add the handler to the global _handlerList (for cleanup on shutdown)
_addHandlerRef(self)
self.createLock()
@@ -981,6 +997,7 @@ class Handler(Filterer):
#get the module data lock, as we're updating a shared structure.
_acquireLock()
try: #unlikely to raise an exception, but you never know...
+ self._closed = True
if self._name and self._name in _handlers:
del _handlers[self._name]
finally:
@@ -1135,8 +1152,14 @@ class FileHandler(StreamHandler):
self.baseFilename = os.path.abspath(filename)
self.mode = mode
self.encoding = encoding
+ if "b" not in mode:
+ self.encoding = io.text_encoding(encoding)
self.errors = errors
self.delay = delay
+ # bpo-26789: FileHandler keeps a reference to the builtin open()
+ # function to be able to open or reopen the file during Python
+ # finalization.
+ self._builtin_open = open
if delay:
#We don't open the stream, but we still need to call the
#Handler constructor to set level, formatter, lock etc.
@@ -1163,6 +1186,8 @@ class FileHandler(StreamHandler):
finally:
# Issue #19523: call unconditionally to
# prevent a handler leak when delay is set
+ # Also see Issue #42378: we also rely on
+ # self._closed being set to True there
StreamHandler.close(self)
finally:
self.release()
@@ -1172,8 +1197,9 @@ class FileHandler(StreamHandler):
Open the current base file with the (original) mode and encoding.
Return the resulting stream.
"""
- return open(self.baseFilename, self.mode, encoding=self.encoding,
- errors=self.errors)
+ open_func = self._builtin_open
+ return open_func(self.baseFilename, self.mode,
+ encoding=self.encoding, errors=self.errors)
def emit(self, record):
"""
@@ -1181,10 +1207,15 @@ class FileHandler(StreamHandler):
If the stream was not opened because 'delay' was specified in the
constructor, open it before calling the superclass's emit.
+
+ If stream is not open, current mode is 'w' and `_closed=True`, record
+ will not be emitted (see Issue #42378).
"""
if self.stream is None:
- self.stream = self._open()
- StreamHandler.emit(self, record)
+ if self.mode != 'w' or not self._closed:
+ self.stream = self._open()
+ if self.stream:
+ StreamHandler.emit(self, record)
def __repr__(self):
level = getLevelName(self.level)
@@ -1492,7 +1523,11 @@ class Logger(Filterer):
if self.isEnabledFor(CRITICAL):
self._log(CRITICAL, msg, args, **kwargs)
- fatal = critical
+ def fatal(self, msg, *args, **kwargs):
+ """
+ Don't use this method, use critical() instead.
+ """
+ self.critical(msg, *args, **kwargs)
def log(self, level, msg, *args, **kwargs):
"""
@@ -1763,7 +1798,7 @@ class LoggerAdapter(object):
information in logging output.
"""
- def __init__(self, logger, extra):
+ def __init__(self, logger, extra=None):
"""
Initialize the adapter with a logger and a dict-like object which
provides contextual information. This constructor signature allows
@@ -1998,8 +2033,10 @@ def basicConfig(**kwargs):
filename = kwargs.pop("filename", None)
mode = kwargs.pop("filemode", 'a')
if filename:
- if 'b'in mode:
+ if 'b' in mode:
errors = None
+ else:
+ encoding = io.text_encoding(encoding)
h = FileHandler(filename, mode,
encoding=encoding, errors=errors)
else:
@@ -2051,7 +2088,11 @@ def critical(msg, *args, **kwargs):
basicConfig()
root.critical(msg, *args, **kwargs)
-fatal = critical
+def fatal(msg, *args, **kwargs):
+ """
+ Don't use this function, use critical() instead.
+ """
+ critical(msg, *args, **kwargs)
def error(msg, *args, **kwargs):
"""
diff --git a/contrib/tools/python3/src/Lib/logging/config.py b/contrib/tools/python3/src/Lib/logging/config.py
index fd3aded7608..3bc63b78621 100644
--- a/contrib/tools/python3/src/Lib/logging/config.py
+++ b/contrib/tools/python3/src/Lib/logging/config.py
@@ -48,7 +48,7 @@ RESET_ERROR = errno.ECONNRESET
# _listener holds the server object doing the listening
_listener = None
-def fileConfig(fname, defaults=None, disable_existing_loggers=True):
+def fileConfig(fname, defaults=None, disable_existing_loggers=True, encoding=None):
"""
Read the logging configuration from a ConfigParser-format file.
@@ -66,7 +66,8 @@ def fileConfig(fname, defaults=None, disable_existing_loggers=True):
if hasattr(fname, 'readline'):
cp.read_file(fname)
else:
- cp.read(fname)
+ encoding = io.text_encoding(encoding)
+ cp.read(fname, encoding=encoding)
formatters = _create_formatters(cp)
diff --git a/contrib/tools/python3/src/Lib/logging/handlers.py b/contrib/tools/python3/src/Lib/logging/handlers.py
index 572e370110a..61a39958c0a 100644
--- a/contrib/tools/python3/src/Lib/logging/handlers.py
+++ b/contrib/tools/python3/src/Lib/logging/handlers.py
@@ -23,7 +23,7 @@ Copyright (C) 2001-2021 Vinay Sajip. All Rights Reserved.
To use, simply 'import logging.handlers' and log away!
"""
-import logging, socket, os, pickle, struct, time, re
+import io, logging, socket, os, pickle, struct, time, re
from stat import ST_DEV, ST_INO, ST_MTIME
import queue
import threading
@@ -150,6 +150,8 @@ class RotatingFileHandler(BaseRotatingHandler):
# on each run.
if maxBytes > 0:
mode = 'a'
+ if "b" not in mode:
+ encoding = io.text_encoding(encoding)
BaseRotatingHandler.__init__(self, filename, mode, encoding=encoding,
delay=delay, errors=errors)
self.maxBytes = maxBytes
@@ -208,6 +210,7 @@ class TimedRotatingFileHandler(BaseRotatingHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0,
encoding=None, delay=False, utc=False, atTime=None,
errors=None):
+ encoding = io.text_encoding(encoding)
BaseRotatingHandler.__init__(self, filename, 'a', encoding=encoding,
delay=delay, errors=errors)
self.when = when.upper()
@@ -467,6 +470,8 @@ class WatchedFileHandler(logging.FileHandler):
"""
def __init__(self, filename, mode='a', encoding=None, delay=False,
errors=None):
+ if "b" not in mode:
+ encoding = io.text_encoding(encoding)
logging.FileHandler.__init__(self, filename, mode=mode,
encoding=encoding, delay=delay,
errors=errors)
@@ -1167,7 +1172,7 @@ class NTEventLogHandler(logging.Handler):
class HTTPHandler(logging.Handler):
"""
- A class which sends records to a Web server, using either GET or
+ A class which sends records to a web server, using either GET or
POST semantics.
"""
def __init__(self, host, url, method="GET", secure=False, credentials=None,
@@ -1216,7 +1221,7 @@ class HTTPHandler(logging.Handler):
"""
Emit a record.
- Send the record to the Web server as a percent-encoded dictionary
+ Send the record to the web server as a percent-encoded dictionary
"""
try:
import urllib.parse