From 552b07555257243e649dfb89b44ea6de2f92dee1 Mon Sep 17 00:00:00 2001 From: viralpraxis Date: Thu, 13 Feb 2025 00:02:31 +0300 Subject: [PATCH] [Feature #21133] Add `skip_header` option ref: https://bugs.ruby-lang.org/issues/21133 Creating a logger automatically writes a hardcoded header comment ("# Logfile created on ..."). While this helps verify that logdev is writable as early as possible (rather than on the first log entry), it also serves as a useful indicator of which program created the logfile. However, this header can introduce unnecessary complexity -- especially when working with third-party tools that need to ignore these lines. This commit introduces a `skip_header` boolean option (default is `false`), allowing API consumers to disable the header if needed. --- lib/logger.rb | 8 ++++++-- lib/logger/log_device.rb | 8 ++++++-- test/logger/test_logdevice.rb | 6 ++++++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/logger.rb b/lib/logger.rb index 3e6ab38..48b137d 100644 --- a/lib/logger.rb +++ b/lib/logger.rb @@ -577,11 +577,14 @@ def fatal!; self.level = FATAL; end # - +reraise_write_errors+: An array of exception classes, which will # be reraised if there is an error when writing to the log device. # The default is to swallow all exceptions raised. + # - +skip_header+: If +true+, prevents the logger from writing a header + # when creating a new log file. The default is +false+, meaning + # the header will be written as usual. # def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG, progname: nil, formatter: nil, datetime_format: nil, binmode: false, shift_period_suffix: '%Y%m%d', - reraise_write_errors: []) + reraise_write_errors: [], skip_header: false) self.level = level self.progname = progname @default_formatter = Formatter.new @@ -594,7 +597,8 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG, shift_size: shift_size, shift_period_suffix: shift_period_suffix, binmode: binmode, - reraise_write_errors: reraise_write_errors) + reraise_write_errors: reraise_write_errors, + skip_header: skip_header) end end diff --git a/lib/logger/log_device.rb b/lib/logger/log_device.rb index cde3158..e16f3b7 100644 --- a/lib/logger/log_device.rb +++ b/lib/logger/log_device.rb @@ -11,10 +11,14 @@ class LogDevice attr_reader :filename include MonitorMixin - def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, binmode: false, reraise_write_errors: []) + def initialize( + log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, + binmode: false, reraise_write_errors: [], skip_header: false + ) @dev = @filename = @shift_age = @shift_size = @shift_period_suffix = nil @binmode = binmode @reraise_write_errors = reraise_write_errors + @skip_header = skip_header mon_initialize set_dev(log) set_file(shift_age, shift_size, shift_period_suffix) if @filename @@ -132,7 +136,7 @@ def create_logfile(filename) logdev = fixup_mode(logdev) logdev.sync = true logdev.binmode if @binmode - add_log_header(logdev) + add_log_header(logdev) unless @skip_header logdev.flock(File::LOCK_UN) logdev rescue Errno::EEXIST diff --git a/test/logger/test_logdevice.rb b/test/logger/test_logdevice.rb index c9b0816..ed7ca8a 100644 --- a/test/logger/test_logdevice.rb +++ b/test/logger/test_logdevice.rb @@ -502,6 +502,12 @@ def test_shifting_age_in_multiprocess end end + def test_open_without_header + d(@filename, skip_header: true) + + assert_equal("", File.read(@filename)) + end + def test_open_logfile_in_multiprocess tmpfile = Tempfile.new([File.basename(__FILE__, '.*'), '_1.log']) logfile = tmpfile.path