summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/logger.rb11
-rw-r--r--lib/logger/log_device.rb5
-rw-r--r--test/logger/test_logdevice.rb3
-rw-r--r--test/logger/test_logger.rb23
4 files changed, 37 insertions, 5 deletions
diff --git a/lib/logger.rb b/lib/logger.rb
index 4794911a69..ddd80176df 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -365,6 +365,8 @@ class Logger
# Logging formatter. Default values is an instance of Logger::Formatter.
# +datetime_format+::
# Date and time format. Default value is '%Y-%m-%d %H:%M:%S'.
+ # +binmode+::
+ # Use binany mode on the log device. Defaul value is false.
# +shift_period_suffix+::
# The log file suffix format for +daily+, +weekly+ or +monthly+ rotation.
# Default is '%Y%m%d'.
@@ -375,7 +377,7 @@ class Logger
#
def initialize(logdev, shift_age = 0, shift_size = 1048576, level: DEBUG,
progname: nil, formatter: nil, datetime_format: nil,
- shift_period_suffix: '%Y%m%d')
+ binmode: false, shift_period_suffix: '%Y%m%d')
self.level = level
self.progname = progname
@default_formatter = Formatter.new
@@ -383,9 +385,10 @@ class Logger
self.formatter = formatter
@logdev = nil
if logdev
- @logdev = LogDevice.new(logdev, :shift_age => shift_age,
- :shift_size => shift_size,
- :shift_period_suffix => shift_period_suffix)
+ @logdev = LogDevice.new(logdev, shift_age: shift_age,
+ shift_size: shift_size,
+ shift_period_suffix: shift_period_suffix,
+ binmode: binmode)
end
end
diff --git a/lib/logger/log_device.rb b/lib/logger/log_device.rb
index c6dc43c11a..5661f5ce14 100644
--- a/lib/logger/log_device.rb
+++ b/lib/logger/log_device.rb
@@ -9,8 +9,9 @@ class Logger
attr_reader :filename
include MonitorMixin
- def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil)
+ def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, binmode: false)
@dev = @filename = @shift_age = @shift_size = @shift_period_suffix = nil
+ @binmode = binmode
mon_initialize
set_dev(log)
if @filename
@@ -82,6 +83,7 @@ class Logger
else
@dev = open_logfile(log)
@dev.sync = true
+ @dev.binmode if @binmode
@filename = log
end
end
@@ -99,6 +101,7 @@ class Logger
logdev = File.open(filename, (File::WRONLY | File::APPEND | File::CREAT | File::EXCL))
logdev.flock(File::LOCK_EX)
logdev.sync = true
+ logdev.binmode if @binmode
add_log_header(logdev)
logdev.flock(File::LOCK_UN)
rescue Errno::EEXIST
diff --git a/test/logger/test_logdevice.rb b/test/logger/test_logdevice.rb
index 72802f690d..40f646d855 100644
--- a/test/logger/test_logdevice.rb
+++ b/test/logger/test_logdevice.rb
@@ -45,6 +45,7 @@ class TestLogDevice < Test::Unit::TestCase
begin
assert_file.exist?(@filename)
assert_predicate(logdev.dev, :sync)
+ refute_predicate(logdev.dev, :binmode?)
assert_equal(@filename, logdev.filename)
logdev.write('hello')
ensure
@@ -53,6 +54,8 @@ class TestLogDevice < Test::Unit::TestCase
# create logfile whitch is already exist.
logdev = d(@filename)
begin
+ assert_predicate(logdev.dev, :sync)
+ refute_predicate(logdev.dev, :binmode?)
logdev.write('world')
logfile = File.read(@filename)
assert_equal(2, logfile.split(/\n/).size)
diff --git a/test/logger/test_logger.rb b/test/logger/test_logger.rb
index 5806e0c685..029203877a 100644
--- a/test/logger/test_logger.rb
+++ b/test/logger/test_logger.rb
@@ -240,6 +240,29 @@ class TestLogger < Test::Unit::TestCase
assert_equal("false\n", log.msg)
end
+ def test_add_binary_data_with_binmode_logdev
+ EnvUtil.with_default_internal(Encoding::UTF_8) do
+ begin
+ tempfile = Tempfile.new("logger")
+ tempfile.close
+ filename = tempfile.path
+ File.unlink(filename)
+
+ logger = Logger.new filename, binmode: true
+ logger.level = Logger::DEBUG
+
+ str = +"\x80"
+ str.force_encoding("ASCII-8BIT")
+
+ logger.add Logger::DEBUG, str
+ assert_equal(2, File.binread(filename).split(/\n/).size)
+ ensure
+ logger.close
+ tempfile.unlink
+ end
+ end
+ end
+
def test_level_log
logger = Logger.new(nil)
logger.progname = "my_progname"