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