| Class | Logger::LogDevice |
| In: |
lib/logger.rb
|
| Parent: | Object |
| SiD | = | 24 * 60 * 60 |
| dev | [R] | |
| filename | [R] |
# File lib/logger.rb, line 481
481: def initialize(log = nil, opt = {})
482: @dev = @filename = @shift_age = @shift_size = nil
483: @mutex = LogDeviceMutex.new
484: if log.respond_to?(:write) and log.respond_to?(:close)
485: @dev = log
486: else
487: @dev = open_logfile(log)
488: @dev.sync = true
489: @filename = log
490: @shift_age = opt[:shift_age] || 7
491: @shift_size = opt[:shift_size] || 1048576
492: end
493: end
# File lib/logger.rb, line 508
508: def close
509: @mutex.synchronize do
510: @dev.close
511: end
512: end
# File lib/logger.rb, line 495
495: def write(message)
496: @mutex.synchronize do
497: if @shift_age and @dev.respond_to?(:stat)
498: begin
499: check_shift_log
500: rescue
501: raise Logger::ShiftingError.new("Shifting failed. #{$!}")
502: end
503: end
504: @dev.write(message)
505: end
506: end
# File lib/logger.rb, line 531
531: def add_log_header(file)
532: file.write(
533: "# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]
534: )
535: end
# File lib/logger.rb, line 539
539: def check_shift_log
540: if @shift_age.is_a?(Integer)
541: # Note: always returns false if '0'.
542: if @filename && (@shift_age > 0) && (@dev.stat.size > @shift_size)
543: shift_log_age
544: end
545: else
546: now = Time.now
547: if @dev.stat.mtime <= previous_period_end(now)
548: shift_log_period(now)
549: end
550: end
551: end
# File lib/logger.rb, line 524
524: def create_logfile(filename)
525: logdev = open(filename, (File::WRONLY | File::APPEND | File::CREAT))
526: logdev.sync = true
527: add_log_header(logdev)
528: logdev
529: end
# File lib/logger.rb, line 590
590: def eod(t)
591: Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
592: end
# File lib/logger.rb, line 516
516: def open_logfile(filename)
517: if (FileTest.exist?(filename))
518: open(filename, (File::WRONLY | File::APPEND))
519: else
520: create_logfile(filename)
521: end
522: end
# File lib/logger.rb, line 577
577: def previous_period_end(now)
578: case @shift_age
579: when /^daily$/
580: eod(now - 1 * SiD)
581: when /^weekly$/
582: eod(now - ((now.wday + 1) * SiD))
583: when /^monthly$/
584: eod(now - now.mday * SiD)
585: else
586: now
587: end
588: end
# File lib/logger.rb, line 553
553: def shift_log_age
554: (@shift_age-3).downto(0) do |i|
555: if FileTest.exist?("#{@filename}.#{i}")
556: File.rename("#{@filename}.#{i}", "#{@filename}.#{i+1}")
557: end
558: end
559: @dev.close
560: File.rename("#{@filename}", "#{@filename}.0")
561: @dev = create_logfile(@filename)
562: return true
563: end
# File lib/logger.rb, line 565
565: def shift_log_period(now)
566: postfix = previous_period_end(now).strftime("%Y%m%d") # YYYYMMDD
567: age_file = "#{@filename}.#{postfix}"
568: if FileTest.exist?(age_file)
569: raise RuntimeError.new("'#{ age_file }' already exists.")
570: end
571: @dev.close
572: File.rename("#{@filename}", age_file)
573: @dev = create_logfile(@filename)
574: return true
575: end