fix (slash) logger
This commit is contained in:
parent
969fa758a1
commit
1b887c0186
126
lib/logger.rb
126
lib/logger.rb
@ -1,5 +1,6 @@
|
|||||||
# Copied logger from logger gem.
|
# Copied logger from logger gem.
|
||||||
# gemoved monitor for opal
|
# removed monitor for opal
|
||||||
|
# rmoevd shifting and file options
|
||||||
|
|
||||||
# == Description
|
# == Description
|
||||||
#
|
#
|
||||||
@ -268,33 +269,27 @@ class Logger
|
|||||||
#
|
#
|
||||||
# === Synopsis
|
# === Synopsis
|
||||||
#
|
#
|
||||||
# Logger.new(name, shift_age = 7, shift_size = 1048576)
|
# Logger.new(name)
|
||||||
# Logger.new(name, shift_age = 'weekly')
|
# Logger.new(name)
|
||||||
#
|
#
|
||||||
# === Args
|
# === Args
|
||||||
#
|
#
|
||||||
# +logdev+::
|
# +logdev+::
|
||||||
# The log device. This is a filename (String) or IO object (typically
|
# The log device. This is a filename (String) or IO object (typically
|
||||||
# +STDOUT+, +STDERR+, or an open file).
|
# +STDOUT+, +STDERR+, or an open file).
|
||||||
# +shift_age+::
|
|
||||||
# Number of old log files to keep, *or* frequency of rotation (+daily+,
|
|
||||||
# +weekly+ or +monthly+).
|
|
||||||
# +shift_size+::
|
|
||||||
# Maximum logfile size (only applies when +shift_age+ is a number).
|
|
||||||
#
|
#
|
||||||
# === Description
|
# === Description
|
||||||
#
|
#
|
||||||
# Create an instance.
|
# Create an instance.
|
||||||
#
|
#
|
||||||
def initialize(logdev, shift_age = 0, shift_size = 1048576)
|
def initialize(logdev)
|
||||||
@progname = nil
|
@progname = nil
|
||||||
@level = DEBUG
|
@level = DEBUG
|
||||||
@default_formatter = Formatter.new
|
@default_formatter = Formatter.new
|
||||||
@formatter = nil
|
@formatter = nil
|
||||||
@logdev = nil
|
@logdev = nil
|
||||||
if logdev
|
if logdev
|
||||||
@logdev = LogDevice.new(logdev, :shift_age => shift_age,
|
@logdev = LogDevice.new(logdev)
|
||||||
:shift_size => shift_size)
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -518,36 +513,12 @@ private
|
|||||||
attr_reader :dev
|
attr_reader :dev
|
||||||
attr_reader :filename
|
attr_reader :filename
|
||||||
|
|
||||||
def initialize(log = nil, opt = {})
|
def initialize(log)
|
||||||
@dev = @filename = @shift_age = @shift_size = nil
|
|
||||||
if log.respond_to?(:write) and log.respond_to?(:close)
|
|
||||||
@dev = log
|
@dev = log
|
||||||
else
|
|
||||||
@dev = open_logfile(log)
|
|
||||||
@dev.sync = true
|
|
||||||
@filename = log
|
|
||||||
@shift_age = opt[:shift_age] || 7
|
|
||||||
@shift_size = opt[:shift_size] || 1048576
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def write(message)
|
def write(message)
|
||||||
begin
|
|
||||||
if @shift_age and @dev.respond_to?(:stat)
|
|
||||||
begin
|
|
||||||
check_shift_log
|
|
||||||
rescue
|
|
||||||
warn("log shifting failed. #{$!}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
begin
|
|
||||||
@dev.write(message)
|
@dev.write(message)
|
||||||
rescue
|
|
||||||
warn("log writing failed. #{$!}")
|
|
||||||
end
|
|
||||||
rescue Exception => ignored
|
|
||||||
warn("log writing failed. #{ignored}")
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def close
|
def close
|
||||||
@ -560,87 +531,8 @@ private
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def open_logfile(filename)
|
|
||||||
if (FileTest.exist?(filename))
|
|
||||||
open(filename, (File::WRONLY | File::APPEND))
|
|
||||||
else
|
|
||||||
create_logfile(filename)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def create_logfile(filename)
|
|
||||||
logdev = open(filename, (File::WRONLY | File::APPEND | File::CREAT))
|
|
||||||
logdev.sync = true
|
|
||||||
add_log_header(logdev)
|
|
||||||
logdev
|
|
||||||
end
|
|
||||||
|
|
||||||
def add_log_header(file)
|
|
||||||
file.write(
|
|
||||||
"# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
SiD = 24 * 60 * 60
|
SiD = 24 * 60 * 60
|
||||||
|
|
||||||
def check_shift_log
|
|
||||||
if @shift_age.is_a?(Integer)
|
|
||||||
# Note: always returns false if '0'.
|
|
||||||
if @filename && (@shift_age > 0) && (@dev.stat.size > @shift_size)
|
|
||||||
shift_log_age
|
|
||||||
end
|
|
||||||
else
|
|
||||||
now = Time.now
|
|
||||||
period_end = previous_period_end(now)
|
|
||||||
if @dev.stat.mtime <= period_end
|
|
||||||
shift_log_period(period_end)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def shift_log_age
|
|
||||||
(@shift_age-3).downto(0) do |i|
|
|
||||||
if FileTest.exist?("#{@filename}.#{i}")
|
|
||||||
File.rename("#{@filename}.#{i}", "#{@filename}.#{i+1}")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@dev.close rescue nil
|
|
||||||
File.rename("#{@filename}", "#{@filename}.0")
|
|
||||||
@dev = create_logfile(@filename)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
def shift_log_period(period_end)
|
|
||||||
postfix = period_end.strftime("%Y%m%d") # YYYYMMDD
|
|
||||||
age_file = "#{@filename}.#{postfix}"
|
|
||||||
if FileTest.exist?(age_file)
|
|
||||||
# try to avoid filename crash caused by Timestamp change.
|
|
||||||
idx = 0
|
|
||||||
# .99 can be overridden; avoid too much file search with 'loop do'
|
|
||||||
while idx < 100
|
|
||||||
idx += 1
|
|
||||||
age_file = "#{@filename}.#{postfix}.#{idx}"
|
|
||||||
break unless FileTest.exist?(age_file)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
@dev.close rescue nil
|
|
||||||
File.rename("#{@filename}", age_file)
|
|
||||||
@dev = create_logfile(@filename)
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
|
|
||||||
def previous_period_end(now)
|
|
||||||
case @shift_age
|
|
||||||
when /^daily$/
|
|
||||||
eod(now - 1 * SiD)
|
|
||||||
when /^weekly$/
|
|
||||||
eod(now - ((now.wday + 1) * SiD))
|
|
||||||
when /^monthly$/
|
|
||||||
eod(now - now.mday * SiD)
|
|
||||||
else
|
|
||||||
now
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def eod(t)
|
def eod(t)
|
||||||
Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
|
Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
|
||||||
@ -738,8 +630,8 @@ private
|
|||||||
# Sets the log device for this application. See <tt>Logger.new</tt> for an explanation
|
# Sets the log device for this application. See <tt>Logger.new</tt> for an explanation
|
||||||
# of the arguments.
|
# of the arguments.
|
||||||
#
|
#
|
||||||
def set_log(logdev, shift_age = 0, shift_size = 1024000)
|
def set_log(logdev)
|
||||||
@log = Logger.new(logdev, shift_age, shift_size)
|
@log = Logger.new(logdev)
|
||||||
@log.progname = @appname
|
@log.progname = @appname
|
||||||
@log.level = @level
|
@log.level = @level
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user