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 +4 -4
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/push_gem.yml +46 -0
- data/.github/workflows/test.yml +32 -0
- data/.gitignore +11 -0
- data/Gemfile +10 -0
- data/README.md +104 -0
- data/Rakefile +30 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/lib/logger/log_device.rb +83 -56
- data/lib/logger/version.rb +1 -1
- data/logger.gemspec +7 -1
- metadata +16 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 46ba87e952de11303f4d8a1801c62441825513ed53de7ab20ec75d21b9524cdb
|
4
|
+
data.tar.gz: 985b136ab6b4027a0c28b8980374fc3beed8f3df3b31ee02fe57c0de5ab3cb56
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c3cb3e144eab09fddc21017774faa4b4f4260ddba3bc8d1b0244654c3c2bf13e610debfd3cef36e9bb83b31379dc5853384accadb586f3415deb090ac0fc1fdb
|
7
|
+
data.tar.gz: 82b5a284490100bee206a12e7030e3fb6287aca0ce8196e7ccc0673445b9b713df77438514b36f2e711523d5e2d1bdb897b83811ea752b3bbe26940efacee0eb
|
@@ -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
data/Gemfile
ADDED
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
data/lib/logger/log_device.rb
CHANGED
@@ -30,29 +30,13 @@ class Logger
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def write(message)
|
33
|
-
|
33
|
+
handle_write_errors("writing") do
|
34
34
|
synchronize do
|
35
35
|
if @shift_age and @dev.respond_to?(:stat)
|
36
|
-
|
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,
|
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,
|
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
|
-
|
121
|
-
logdev.sync = true
|
136
|
+
open_logfile(filename)
|
122
137
|
end
|
123
|
-
|
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
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
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
|
-
|
173
|
-
|
174
|
-
|
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
|
-
|
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
|
data/lib/logger/version.rb
CHANGED
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
|
-
|
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.
|
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:
|
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
|
-
|
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: []
|