diff --git a/.github/workflows/push_gem.yml b/.github/workflows/push_gem.yml
index 847493f..de54a5b 100644
--- a/.github/workflows/push_gem.yml
+++ b/.github/workflows/push_gem.yml
@@ -23,24 +23,24 @@ jobs:
steps:
- name: Harden Runner
- uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0
+ uses: step-security/harden-runner@58077d3c7e43986b6b15fba718e8ea69e387dfcc # v2.15.1
with:
egress-policy: audit
- - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
+ - uses: actions/checkout@1af3b93b6815bc44a9784bd300feb67ff0d1eeb3 # v6.0.0
- name: Set up Ruby
- uses: ruby/setup-ruby@a6e6f86333f0a2523ece813039b8b4be04560854 # v1.190.0
+ uses: ruby/setup-ruby@d5126b9b3579e429dd52e51e68624dda2e05be25 # v1.267.0
with:
bundler-cache: true
ruby-version: ruby
- name: Publish to RubyGems
- uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32 # v1.1.1
+ uses: rubygems/release-gem@e9a6361a0b14562539327c2a02373edc56dd3169 # v1.1.4
- name: Create GitHub release
run: |
tag_name="$(git describe --tags --abbrev=0)"
gh release create "${tag_name}" --verify-tag --generate-notes
env:
- GITHUB_TOKEN: ${{ secrets.MATZBOT_GITHUB_WORKFLOW_TOKEN }}
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index ad325f0..73a7361 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -25,7 +25,7 @@ jobs:
os: windows-latest
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v6
- name: Set up Ruby
uses: ruby/setup-ruby@v1
with:
diff --git a/Gemfile b/Gemfile
index ba909e8..723b810 100644
--- a/Gemfile
+++ b/Gemfile
@@ -5,6 +5,7 @@ gemspec
group :development do
gem "bundler"
gem "rake"
+ gem "rdoc"
gem "test-unit"
gem "test-unit-ruby-core"
end
diff --git a/lib/logger.rb b/lib/logger.rb
index 25e2c27..be00457 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -545,6 +545,7 @@ def fatal!; self.level = FATAL; end
# new entries are appended.
# - An IO stream (typically $stdout, $stderr. or
# an open file): entries are to be written to the given stream.
+ # - An instance of Logger::LogDevice, such as the #logdev of another Logger.
# - +nil+ or +File::NULL+: no entries are to be written.
#
# Argument +shift_age+ must be one of:
@@ -591,11 +592,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
@@ -603,15 +607,28 @@ def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
self.formatter = formatter
@logdev = nil
@level_override = {}
- if logdev && logdev != File::NULL
+ return unless logdev
+ case logdev
+ when File::NULL
+ # null logger
+ when LogDevice
+ @logdev = logdev
+ else
@logdev = LogDevice.new(logdev, shift_age: shift_age,
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
+ # The underlying log device.
+ #
+ # This is the first argument passed to the constructor, wrapped in a
+ # Logger::LogDevice, along with the binmode flag and rotation options.
+ attr_reader :logdev
+
# Sets the logger's output stream:
#
# - If +logdev+ is +nil+, reopens the current output stream.
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/lib/logger/version.rb b/lib/logger/version.rb
index 463be13..0d74bec 100644
--- a/lib/logger/version.rb
+++ b/lib/logger/version.rb
@@ -1,5 +1,5 @@
# frozen_string_literal: true
class Logger
- VERSION = "1.6.6"
+ VERSION = "1.7.0"
end
diff --git a/test/logger/test_logdevice.rb b/test/logger/test_logdevice.rb
index c9b0816..f8350df 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
@@ -739,7 +745,7 @@ class << Time
def test_shifting_weekly_dst_change
Dir.mktmpdir do |tmpdir|
- assert_separately([{"TZ"=>"Europe/London"}, *%W"-I#{@top_dir} -rlogger -C#{tmpdir} -"], "#{<<-"begin;"}\n#{<<-'end;'}")
+ assert_separately([{"TZ"=>"Europe/London"}, *%W"-I#{@top_dir} -W0 -rlogger -C#{tmpdir} -"], "#{<<-"begin;"}\n#{<<-'end;'}")
begin;
begin
module FakeTime
@@ -770,7 +776,7 @@ class << Time
def test_shifting_monthly_dst_change
Dir.mktmpdir do |tmpdir|
- assert_separately([{"TZ"=>"Europe/London"}, *%W"-I#{@top_dir} -rlogger -C#{tmpdir} -"], "#{<<-"begin;"}\n#{<<-'end;'}")
+ assert_separately([{"TZ"=>"Europe/London"}, *%W"-I#{@top_dir} -W0 -rlogger -C#{tmpdir} -"], "#{<<-"begin;"}\n#{<<-'end;'}")
begin;
begin
module FakeTime
diff --git a/test/logger/test_logger.rb b/test/logger/test_logger.rb
index ea27fba..75a0f74 100644
--- a/test/logger/test_logger.rb
+++ b/test/logger/test_logger.rb
@@ -177,6 +177,16 @@ def test_initialize
assert_nil(logger.datetime_format)
end
+ def test_logdev
+ logger = Logger.new(STDERR)
+ assert_instance_of(Logger::LogDevice, logger.logdev)
+
+ logdev = Logger::LogDevice.new(STDERR)
+ logger = Logger.new(logdev)
+ assert_instance_of(Logger::LogDevice, logger.logdev)
+ assert_equal(STDERR, logger.logdev.dev)
+ end
+
def test_initialize_with_level
# default
logger = Logger.new(STDERR)