[FIX] incorrect serialisation of log_handler
Saving log_handler to the config file is not currently special-cased, the value is thus dumped as the repr() of the list, but not deserialized with literal_eval. This means -s breaks log_handler and the configuration file example is incorrect (it looks like a list). Repeated -s further break the log_handler by interpreting the original value as a string, putting it into a list, then reserialising that with repr(), injecting a bunch of escaping backslash. The config file is soon filled with backslashes and doubles in size with each new -s. Furthermore for some reason the whole thing breaks --log-handler (and aliases) entirely, once the wrong log_handler has been saved none of them works anymore. Fixes #4552 Closes #4157
This commit is contained in:
parent
e9f0d79f85
commit
426bcf427c
|
@ -49,7 +49,9 @@ class MyOption (optparse.Option, object):
|
||||||
super(MyOption, self).__init__(*opts, **attrs)
|
super(MyOption, self).__init__(*opts, **attrs)
|
||||||
|
|
||||||
|
|
||||||
def check_ssl():
|
DEFAULT_LOG_HANDLER = ':INFO'
|
||||||
|
|
||||||
|
def _check_ssl():
|
||||||
try:
|
try:
|
||||||
from OpenSSL import SSL
|
from OpenSSL import SSL
|
||||||
import socket
|
import socket
|
||||||
|
@ -58,8 +60,6 @@ def check_ssl():
|
||||||
except:
|
except:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
DEFAULT_LOG_HANDLER = ':INFO'
|
|
||||||
|
|
||||||
def _get_default_datadir():
|
def _get_default_datadir():
|
||||||
home = os.path.expanduser('~')
|
home = os.path.expanduser('~')
|
||||||
if os.path.exists(home):
|
if os.path.exists(home):
|
||||||
|
@ -72,6 +72,20 @@ def _get_default_datadir():
|
||||||
# No "version" kwarg as session and filestore paths are shared against series
|
# No "version" kwarg as session and filestore paths are shared against series
|
||||||
return func(appname=release.product_name, appauthor=release.author)
|
return func(appname=release.product_name, appauthor=release.author)
|
||||||
|
|
||||||
|
def _deduplicate_loggers(loggers):
|
||||||
|
""" Avoid saving multiple logging levels for the same loggers to a save
|
||||||
|
file, that just takes space and the list can potentially grow unbounded
|
||||||
|
if for some odd reason people use :option`odoo.py --save`` all the time.
|
||||||
|
"""
|
||||||
|
# dict(iterable) -> the last item of iterable for any given key wins,
|
||||||
|
# which is what we want and expect. Output order should not matter as
|
||||||
|
# there are no duplicates within the output sequence
|
||||||
|
return (
|
||||||
|
'{}:{}'.format(logger, level)
|
||||||
|
for logger, level in dict(it.split(':') for it in loggers).iteritems()
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class configmanager(object):
|
class configmanager(object):
|
||||||
def __init__(self, fname=None):
|
def __init__(self, fname=None):
|
||||||
"""Constructor.
|
"""Constructor.
|
||||||
|
@ -101,7 +115,7 @@ class configmanager(object):
|
||||||
|
|
||||||
self.misc = {}
|
self.misc = {}
|
||||||
self.config_file = fname
|
self.config_file = fname
|
||||||
self.has_ssl = check_ssl()
|
self.has_ssl = _check_ssl()
|
||||||
|
|
||||||
self._LOGLEVELS = dict([
|
self._LOGLEVELS = dict([
|
||||||
(getattr(loglevels, 'LOG_%s' % x), getattr(logging, x))
|
(getattr(loglevels, 'LOG_%s' % x), getattr(logging, x))
|
||||||
|
@ -623,7 +637,7 @@ class configmanager(object):
|
||||||
if opt in ('log_level',):
|
if opt in ('log_level',):
|
||||||
p.set('options', opt, loglevelnames.get(self.options[opt], self.options[opt]))
|
p.set('options', opt, loglevelnames.get(self.options[opt], self.options[opt]))
|
||||||
elif opt == 'log_handler':
|
elif opt == 'log_handler':
|
||||||
p.set('options', opt, ','.join(deduplicate_loggers(self.options[opt])))
|
p.set('options', opt, ','.join(_deduplicate_loggers(self.options[opt])))
|
||||||
else:
|
else:
|
||||||
p.set('options', opt, self.options[opt])
|
p.set('options', opt, self.options[opt])
|
||||||
|
|
||||||
|
@ -686,18 +700,4 @@ class configmanager(object):
|
||||||
|
|
||||||
config = configmanager()
|
config = configmanager()
|
||||||
|
|
||||||
def deduplicate_loggers(loggers):
|
|
||||||
""" Avoid saving multiple logging levels for the same loggers to a save
|
|
||||||
file, that just takes space and the list can potentially grow unbounded
|
|
||||||
if for some odd reason people use :option`odoo.py --save`` all the time.
|
|
||||||
"""
|
|
||||||
# dict(iterable) -> the last item of iterable for any given key wins,
|
|
||||||
# which is what we want and expect. Output order should not matter as
|
|
||||||
# there are no duplicates within the output sequence
|
|
||||||
return (
|
|
||||||
'{}:{}'.format(logger, level)
|
|
||||||
for logger, level in dict(it.split(':') for it in loggers).iteritems()
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||||
|
|
Loading…
Reference in New Issue