Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 9114b3a

Browse files
committed
Add option to set the binary mode of the log device
Without binmode strings with incompatible encoding can't be written in the file. This is very common in applications that log user provided parameters. We need to allow changing the binnary mode because right now it is impossible to use the built-in log rotation feature when you provide a File object to the LogDevice, and if you provide a filename you can't have binmode.
1 parent 185abc2 commit 9114b3a

File tree

4 files changed

+37
-5
lines changed

4 files changed

+37
-5
lines changed

lib/logger.rb

+7-4
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,8 @@ def fatal!; self.level = FATAL; end
365365
# Logging formatter. Default values is an instance of Logger::Formatter.
366366
# +datetime_format+::
367367
# Date and time format. Default value is '%Y-%m-%d %H:%M:%S'.
368+
# +binmode+::
369+
# Use binany mode on the log device. Defaul value is false.
368370
# +shift_period_suffix+::
369371
# The log file suffix format for +daily+, +weekly+ or +monthly+ rotation.
370372
# Default is '%Y%m%d'.
@@ -375,17 +377,18 @@ def fatal!; self.level = FATAL; end
375377
#
376378
def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
377379
progname: nil, formatter: nil, datetime_format: nil,
378-
shift_period_suffix: '%Y%m%d')
380+
binmode: false, shift_period_suffix: '%Y%m%d')
379381
self.level = level
380382
self.progname = progname
381383
@default_formatter = Formatter.new
382384
self.datetime_format = datetime_format
383385
self.formatter = formatter
384386
@logdev = nil
385387
if logdev
386-
@logdev = LogDevice.new(logdev, :shift_age => shift_age,
387-
:shift_size => shift_size,
388-
:shift_period_suffix => shift_period_suffix)
388+
@logdev = LogDevice.new(logdev, shift_age: shift_age,
389+
shift_size: shift_size,
390+
shift_period_suffix: shift_period_suffix,
391+
binmode: binmode)
389392
end
390393
end
391394

lib/logger/log_device.rb

+4-1
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ class LogDevice
1111
attr_reader :filename
1212
include MonitorMixin
1313

14-
def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil)
14+
def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, binmode: false)
1515
@dev = @filename = @shift_age = @shift_size = @shift_period_suffix = nil
16+
@binmode = binmode
1617
mon_initialize
1718
set_dev(log)
1819
if @filename
@@ -84,6 +85,7 @@ def set_dev(log)
8485
else
8586
@dev = open_logfile(log)
8687
@dev.sync = true
88+
@dev.binmode if @binmode
8789
@filename = log
8890
end
8991
end
@@ -101,6 +103,7 @@ def create_logfile(filename)
101103
logdev = File.open(filename, (File::WRONLY | File::APPEND | File::CREAT | File::EXCL))
102104
logdev.flock(File::LOCK_EX)
103105
logdev.sync = true
106+
logdev.binmode if @binmode
104107
add_log_header(logdev)
105108
logdev.flock(File::LOCK_UN)
106109
rescue Errno::EEXIST

test/logger/test_logdevice.rb

+3
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def test_initialize
4545
begin
4646
assert_file.exist?(@filename)
4747
assert_predicate(logdev.dev, :sync)
48+
refute_predicate(logdev.dev, :binmode?)
4849
assert_equal(@filename, logdev.filename)
4950
logdev.write('hello')
5051
ensure
@@ -53,6 +54,8 @@ def test_initialize
5354
# create logfile whitch is already exist.
5455
logdev = d(@filename)
5556
begin
57+
assert_predicate(logdev.dev, :sync)
58+
refute_predicate(logdev.dev, :binmode?)
5659
logdev.write('world')
5760
logfile = File.read(@filename)
5861
assert_equal(2, logfile.split(/\n/).size)

test/logger/test_logger.rb

+23
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,29 @@ def test_add
240240
assert_equal("false\n", log.msg)
241241
end
242242

243+
def test_add_binary_data_with_binmode_logdev
244+
EnvUtil.with_default_internal(Encoding::UTF_8) do
245+
begin
246+
tempfile = Tempfile.new("logger")
247+
tempfile.close
248+
filename = tempfile.path
249+
File.unlink(filename)
250+
251+
logger = Logger.new filename, binmode: true
252+
logger.level = Logger::DEBUG
253+
254+
str = +"\x80"
255+
str.force_encoding("ASCII-8BIT")
256+
257+
logger.add Logger::DEBUG, str
258+
assert_equal(2, File.binread(filename).split(/\n/).size)
259+
ensure
260+
logger.close
261+
tempfile.unlink
262+
end
263+
end
264+
end
265+
243266
def test_level_log
244267
logger = Logger.new(nil)
245268
logger.progname = "my_progname"

0 commit comments

Comments
 (0)