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