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)