logger 1.6.2 → 1.6.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 513b3bfa57e4f617976d220ea3ab04b6a72f8ce0f3734b80a2de276b623d6b49
4
- data.tar.gz: 26bf01af278a060e23d1d80c83e46d474933d2af9425360223656f62c04c8df6
3
+ metadata.gz: 46ba87e952de11303f4d8a1801c62441825513ed53de7ab20ec75d21b9524cdb
4
+ data.tar.gz: 985b136ab6b4027a0c28b8980374fc3beed8f3df3b31ee02fe57c0de5ab3cb56
5
5
  SHA512:
6
- metadata.gz: be737e542a0c9763d280be61f8fe045c72db441f4c25032c3ac332c926abf21c0e957dcdabe17f8cc403348636c71c1e0ee5d9220ea9108572b8d3457e1e00f9
7
- data.tar.gz: bcc5494d61bda582003ba814ceadce03476ca58cbecad391053b5d7b98538d3ee047bb2cce72efb80af54df0947ec82c9c993124dd91dbb1c421401b356b613f
6
+ metadata.gz: c3cb3e144eab09fddc21017774faa4b4f4260ddba3bc8d1b0244654c3c2bf13e610debfd3cef36e9bb83b31379dc5853384accadb586f3415deb090ac0fc1fdb
7
+ data.tar.gz: 82b5a284490100bee206a12e7030e3fb6287aca0ce8196e7ccc0673445b9b713df77438514b36f2e711523d5e2d1bdb897b83811ea752b3bbe26940efacee0eb
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: 'github-actions'
4
+ directory: '/'
5
+ schedule:
6
+ interval: 'weekly'
@@ -0,0 +1,46 @@
1
+ name: Publish gem to rubygems.org
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: read
10
+
11
+ jobs:
12
+ push:
13
+ if: github.repository == 'ruby/logger'
14
+ runs-on: ubuntu-latest
15
+
16
+ environment:
17
+ name: rubygems.org
18
+ url: https://rubygems.org/gems/logger
19
+
20
+ permissions:
21
+ contents: write
22
+ id-token: write
23
+
24
+ steps:
25
+ - name: Harden Runner
26
+ uses: step-security/harden-runner@0080882f6c36860b6ba35c610c98ce87d4e2f26f # v2.10.2
27
+ with:
28
+ egress-policy: audit
29
+
30
+ - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b # v4.1.4
31
+
32
+ - name: Set up Ruby
33
+ uses: ruby/setup-ruby@a6e6f86333f0a2523ece813039b8b4be04560854 # v1.190.0
34
+ with:
35
+ bundler-cache: true
36
+ ruby-version: ruby
37
+
38
+ - name: Publish to RubyGems
39
+ uses: rubygems/release-gem@a25424ba2ba8b387abc8ef40807c2c85b96cbe32 # v1.1.1
40
+
41
+ - name: Create GitHub release
42
+ run: |
43
+ tag_name="$(git describe --tags --abbrev=0)"
44
+ gh release create "${tag_name}" --verify-tag --generate-notes
45
+ env:
46
+ GITHUB_TOKEN: ${{ secrets.MATZBOT_GITHUB_WORKFLOW_TOKEN }}
@@ -0,0 +1,32 @@
1
+ name: test
2
+
3
+ on: [push, pull_request]
4
+
5
+ jobs:
6
+ ruby-versions:
7
+ uses: ruby/actions/.github/workflows/ruby_versions.yml@master
8
+ with:
9
+ engine: cruby
10
+ min_version: 2.5
11
+
12
+ test:
13
+ needs: ruby-versions
14
+ name: build (${{ matrix.ruby }} / ${{ matrix.os }})
15
+ strategy:
16
+ matrix:
17
+ ruby: ${{ fromJson(needs.ruby-versions.outputs.versions) }}
18
+ os: [ ubuntu-latest, macos-latest, windows-latest ]
19
+ exclude:
20
+ - ruby: 2.5
21
+ os: macos-latest
22
+ runs-on: ${{ matrix.os }}
23
+ steps:
24
+ - uses: actions/checkout@v4
25
+ - name: Set up Ruby
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: ${{ matrix.ruby }}
29
+ - name: Install dependencies
30
+ run: bundle install
31
+ - name: Run test
32
+ run: rake test
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+ Gemfile.lock
10
+ /html/
11
+ /vendor/
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "https://rubygems.org"
2
+
3
+ gemspec
4
+
5
+ group :development do
6
+ gem "bundler"
7
+ gem "rake"
8
+ gem "test-unit"
9
+ gem "test-unit-ruby-core"
10
+ end
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # Logger
2
+
3
+ Logger is a simple but powerful logging utility to output messages in your Ruby program.
4
+
5
+ Logger has the following features:
6
+
7
+ * Print messages to different levels such as `info` and `error`
8
+ * Auto-rolling of log files
9
+ * Setting the format of log messages
10
+ * Specifying a program name in conjunction with the message
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ ```ruby
17
+ gem 'logger'
18
+ ```
19
+
20
+ And then execute:
21
+
22
+ $ bundle
23
+
24
+ Or install it yourself as:
25
+
26
+ $ gem install logger
27
+
28
+ ## Usage
29
+
30
+ ### Simple Example
31
+
32
+ ```ruby
33
+ require 'logger'
34
+
35
+ # Create a Logger that prints to STDOUT
36
+ log = Logger.new(STDOUT)
37
+ log.debug("Created Logger")
38
+
39
+ log.info("Program finished")
40
+
41
+ # Create a Logger that prints to STDERR
42
+ error_log = Logger.new(STDERR)
43
+ error_log = error_log.error("fatal error")
44
+ ```
45
+
46
+ ## Development
47
+
48
+ After checking out the repo, run the following to install dependencies.
49
+
50
+ ```
51
+ $ bin/setup
52
+ ```
53
+
54
+ Then, run the tests as:
55
+
56
+ ```
57
+ $ rake test
58
+ ```
59
+
60
+ To install this gem onto your local machine, run
61
+
62
+ ```
63
+ $ rake install
64
+ ```
65
+
66
+ To release a new version, update the version number in `lib/logger/version.rb`, and then run
67
+
68
+ ```
69
+ $ rake release
70
+ ```
71
+
72
+ which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
73
+
74
+ ## Advanced Development
75
+
76
+ ### Run tests of a specific file
77
+
78
+ ```
79
+ $ ruby test/logger/test_logger.rb
80
+ ```
81
+
82
+ ### Run tests filtering test methods by a name
83
+
84
+ `--name` option is available as:
85
+
86
+ ```
87
+ $ ruby test/logger/test_logger.rb --name test_lshift
88
+ ```
89
+
90
+ ### Publish documents to GitHub Pages
91
+
92
+ ```
93
+ $ rake gh-pages
94
+ ```
95
+
96
+ Then, git commit and push the generated HTMLs onto `gh-pages` branch.
97
+
98
+ ## Contributing
99
+
100
+ Bug reports and pull requests are welcome on GitHub at https://github.com/ruby/logger.
101
+
102
+ ## License
103
+
104
+ The gem is available as open source under the terms of the [BSD-2-Clause](BSDL).
data/Rakefile ADDED
@@ -0,0 +1,30 @@
1
+ begin
2
+ require "bundler/gem_tasks"
3
+ rescue LoadError
4
+ end
5
+
6
+ require "rake/testtask"
7
+ Rake::TestTask.new(:test) do |t|
8
+ t.libs << "test/lib"
9
+ t.ruby_opts << "-rhelper"
10
+ t.test_files = FileList["test/**/test_*.rb"]
11
+ end
12
+
13
+ require "rdoc/task"
14
+ RDoc::Task.new do |doc|
15
+ doc.main = "README.md"
16
+ doc.title = "Logger -- Ruby Standard Logger"
17
+ doc.rdoc_files = FileList.new %w[README.md lib BSDL COPYING]
18
+ doc.rdoc_dir = "html"
19
+ end
20
+
21
+ task "gh-pages" => :rdoc do
22
+ %x[git checkout gh-pages]
23
+ require "fileutils"
24
+ FileUtils.rm_rf "/tmp/html"
25
+ FileUtils.mv "html", "/tmp"
26
+ FileUtils.rm_rf "*"
27
+ FileUtils.cp_r Dir.glob("/tmp/html/*"), "."
28
+ end
29
+
30
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "logger"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -30,29 +30,13 @@ class Logger
30
30
  end
31
31
 
32
32
  def write(message)
33
- begin
33
+ handle_write_errors("writing") do
34
34
  synchronize do
35
35
  if @shift_age and @dev.respond_to?(:stat)
36
- begin
37
- check_shift_log
38
- rescue *@reraise_write_errors
39
- raise
40
- rescue
41
- warn("log shifting failed. #{$!}")
42
- end
43
- end
44
- begin
45
- @dev.write(message)
46
- rescue *@reraise_write_errors
47
- raise
48
- rescue
49
- warn("log writing failed. #{$!}")
36
+ handle_write_errors("shifting") {check_shift_log}
50
37
  end
38
+ handle_write_errors("writing") {@dev.write(message)}
51
39
  end
52
- rescue *@reraise_write_errors
53
- raise
54
- rescue Exception => ignored
55
- warn("log writing failed. #{ignored}")
56
40
  end
57
41
  end
58
42
 
@@ -83,6 +67,17 @@ class Logger
83
67
 
84
68
  private
85
69
 
70
+ # :stopdoc:
71
+
72
+ MODE = File::WRONLY | File::APPEND
73
+ # temporary workaround for TruffleRuby
74
+ if File.const_defined? :SHARE_DELETE
75
+ MODE_TO_OPEN = MODE | File::SHARE_DELETE | File::BINARY
76
+ else
77
+ MODE_TO_OPEN = MODE | File::BINARY
78
+ end
79
+ MODE_TO_CREATE = MODE_TO_OPEN | File::CREAT | File::EXCL
80
+
86
81
  def set_dev(log)
87
82
  if log.respond_to?(:write) and log.respond_to?(:close)
88
83
  @dev = log
@@ -93,34 +88,61 @@ class Logger
93
88
  end
94
89
  else
95
90
  @dev = open_logfile(log)
96
- @dev.sync = true
97
- @dev.binmode if @binmode
98
91
  @filename = log
99
92
  end
100
93
  end
101
94
 
95
+ if MODE_TO_OPEN == MODE
96
+ def fixup_mode(dev, filename)
97
+ dev
98
+ end
99
+ else
100
+ def fixup_mode(dev, filename)
101
+ return dev if @binmode
102
+ dev.autoclose = false
103
+ old_dev = dev
104
+ dev = File.new(dev.fileno, mode: MODE, path: filename)
105
+ old_dev.close
106
+ PathAttr.set_path(dev, filename) if defined?(PathAttr)
107
+ dev
108
+ end
109
+ end
110
+
102
111
  def open_logfile(filename)
103
112
  begin
104
- File.open(filename, (File::WRONLY | File::APPEND))
113
+ dev = File.open(filename, MODE_TO_OPEN)
105
114
  rescue Errno::ENOENT
106
115
  create_logfile(filename)
116
+ else
117
+ dev = fixup_mode(dev, filename)
118
+ dev.sync = true
119
+ dev.binmode if @binmode
120
+ dev
107
121
  end
108
122
  end
109
123
 
110
124
  def create_logfile(filename)
111
125
  begin
112
- logdev = File.open(filename, (File::WRONLY | File::APPEND | File::CREAT | File::EXCL))
126
+ logdev = File.open(filename, MODE_TO_CREATE)
113
127
  logdev.flock(File::LOCK_EX)
128
+ logdev = fixup_mode(logdev, filename)
114
129
  logdev.sync = true
115
130
  logdev.binmode if @binmode
116
131
  add_log_header(logdev)
117
132
  logdev.flock(File::LOCK_UN)
133
+ logdev
118
134
  rescue Errno::EEXIST
119
135
  # file is created by another process
120
- logdev = open_logfile(filename)
121
- logdev.sync = true
136
+ open_logfile(filename)
122
137
  end
123
- logdev
138
+ end
139
+
140
+ def handle_write_errors(mesg)
141
+ yield
142
+ rescue *@reraise_write_errors
143
+ raise
144
+ rescue
145
+ warn("log #{mesg} failed. #{$!}")
124
146
  end
125
147
 
126
148
  def add_log_header(file)
@@ -144,40 +166,33 @@ class Logger
144
166
  end
145
167
  end
146
168
 
147
- if /mswin|mingw|cygwin/ =~ RbConfig::CONFIG['host_os']
148
- def lock_shift_log
149
- yield
150
- end
151
- else
152
- def lock_shift_log
153
- retry_limit = 8
154
- retry_sleep = 0.1
155
- begin
156
- File.open(@filename, File::WRONLY | File::APPEND) do |lock|
157
- lock.flock(File::LOCK_EX) # inter-process locking. will be unlocked at closing file
158
- if File.identical?(@filename, lock) and File.identical?(lock, @dev)
159
- yield # log shifting
160
- else
161
- # log shifted by another process (i-node before locking and i-node after locking are different)
162
- @dev.close rescue nil
163
- @dev = open_logfile(@filename)
164
- @dev.sync = true
165
- end
166
- end
167
- rescue Errno::ENOENT
168
- # @filename file would not exist right after #rename and before #create_logfile
169
- if retry_limit <= 0
170
- warn("log rotation inter-process lock failed. #{$!}")
169
+ def lock_shift_log
170
+ retry_limit = 8
171
+ retry_sleep = 0.1
172
+ begin
173
+ File.open(@filename, MODE_TO_OPEN) do |lock|
174
+ lock.flock(File::LOCK_EX) # inter-process locking. will be unlocked at closing file
175
+ if File.identical?(@filename, lock) and File.identical?(lock, @dev)
176
+ yield # log shifting
171
177
  else
172
- sleep retry_sleep
173
- retry_limit -= 1
174
- retry_sleep *= 2
175
- retry
178
+ # log shifted by another process (i-node before locking and i-node after locking are different)
179
+ @dev.close rescue nil
180
+ @dev = open_logfile(@filename)
176
181
  end
177
182
  end
178
- rescue
179
- warn("log rotation inter-process lock failed. #{$!}")
183
+ rescue Errno::ENOENT
184
+ # @filename file would not exist right after #rename and before #create_logfile
185
+ if retry_limit <= 0
186
+ warn("log rotation inter-process lock failed. #{$!}")
187
+ else
188
+ sleep retry_sleep
189
+ retry_limit -= 1
190
+ retry_sleep *= 2
191
+ retry
192
+ end
180
193
  end
194
+ rescue
195
+ warn("log rotation inter-process lock failed. #{$!}")
181
196
  end
182
197
 
183
198
  def shift_log_age
@@ -212,3 +227,15 @@ class Logger
212
227
  end
213
228
  end
214
229
  end
230
+
231
+ File.open(__FILE__) do |f|
232
+ File.new(f.fileno, autoclose: false, path: "").path
233
+ rescue IOError
234
+ module PathAttr # :nodoc:
235
+ attr_reader :path
236
+
237
+ def self.set_path(file, path)
238
+ file.extend(self).instance_variable_set(:@path, path)
239
+ end
240
+ end
241
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Logger
4
- VERSION = "1.6.2"
4
+ VERSION = "1.6.5"
5
5
  end
data/logger.gemspec CHANGED
@@ -15,8 +15,14 @@ Gem::Specification.new do |spec|
15
15
  spec.homepage = "https://github.com/ruby/logger"
16
16
  spec.licenses = ["Ruby", "BSD-2-Clause"]
17
17
 
18
- spec.files = Dir.glob("lib/**/*.rb") + ["logger.gemspec", "BSDL", "COPYING"]
18
+ # Specify which files should be added to the gem when it is released.
19
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
20
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
21
+ `git ls-files -z 2>#{IO::NULL}`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
22
+ end
19
23
  spec.require_paths = ["lib"]
20
24
 
21
25
  spec.required_ruby_version = ">= 2.5.0"
26
+
27
+ spec.metadata["changelog_uri"] = spec.homepage + "/releases"
22
28
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.6.2
4
+ version: 1.6.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Naotoshi Seo
8
8
  - SHIBATA Hiroshi
9
- autorequire:
9
+ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2024-12-02 00:00:00.000000000 Z
12
+ date: 2025-01-10 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Provides a simple logging utility for outputting messages.
15
15
  email:
@@ -19,8 +19,17 @@ executables: []
19
19
  extensions: []
20
20
  extra_rdoc_files: []
21
21
  files:
22
+ - ".github/dependabot.yml"
23
+ - ".github/workflows/push_gem.yml"
24
+ - ".github/workflows/test.yml"
25
+ - ".gitignore"
22
26
  - BSDL
23
27
  - COPYING
28
+ - Gemfile
29
+ - README.md
30
+ - Rakefile
31
+ - bin/console
32
+ - bin/setup
24
33
  - lib/logger.rb
25
34
  - lib/logger/errors.rb
26
35
  - lib/logger/formatter.rb
@@ -33,8 +42,9 @@ homepage: https://github.com/ruby/logger
33
42
  licenses:
34
43
  - Ruby
35
44
  - BSD-2-Clause
36
- metadata: {}
37
- post_install_message:
45
+ metadata:
46
+ changelog_uri: https://github.com/ruby/logger/releases
47
+ post_install_message:
38
48
  rdoc_options: []
39
49
  require_paths:
40
50
  - lib
@@ -50,7 +60,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
50
60
  version: '0'
51
61
  requirements: []
52
62
  rubygems_version: 3.5.11
53
- signing_key:
63
+ signing_key:
54
64
  specification_version: 4
55
65
  summary: Provides a simple logging utility for outputting messages.
56
66
  test_files: []