When a custom formatter that responds to datetime_format= is set on a Logger, calling Logger#datetime_format= applies the format to the internal @default_formatter instead of the active formatter. This means the datetime format has no effect on log output.
Steps to reproduce
require'logger'custom_formatter=Logger::Formatter.newlogger=Logger.new($stdout,formatter: custom_formatter,datetime_format: "%d%b%Y@%H:%M:%S")# Expected: datetime_format is set on custom_formatterlogger.datetime_format# => nil (unexpected)custom_formatter.datetime_format# => nil (unexpected)logger.info("hello")# Outputs default datetime format instead of "%d%b%Y@%H:%M:%S"The same issue occurs when setting datetime_format after initialization:
logger=Logger.new($stdout,formatter: Logger::Formatter.new)logger.datetime_format="%d%b%Y@%H:%M:%S"logger.info("hello")# Still uses default datetime formatRoot cause
Logger#datetime_format= always delegates to @default_formatter:
defdatetime_format=(datetime_format)@default_formatter.datetime_format=datetime_formatend
But format_message uses @formatter when set:
defformat_message(severity,datetime,progname,msg)(@formatter || @default_formatter).call(severity,datetime,progname,msg)end
Additionally, in initialize, datetime_format is set before the custom formatter is assigned, so it never reaches the custom formatter even during construction.
Expected behavior
datetime_format= should apply to the active formatter (custom or default) if it responds to datetime_format=.
When a custom formatter that responds to
datetime_format=is set on a Logger, callingLogger#datetime_format=applies the format to the internal@default_formatterinstead of the active formatter. This means the datetime format has no effect on log output.Steps to reproduce
The same issue occurs when setting
datetime_formatafter initialization:Root cause
Logger#datetime_format=always delegates to@default_formatter:But
format_messageuses@formatterwhen set:Additionally, in
initialize,datetime_formatis set before the custom formatter is assigned, so it never reaches the custom formatter even during construction.Expected behavior
datetime_format=should apply to the active formatter (custom or default) if it responds todatetime_format=.