Class Logger::LogDevice
In: lib/logger.rb
Parent: Object

Methods

Classes and Modules

Class Logger::LogDevice::LogDeviceMutex

Constants

SiD = 24 * 60 * 60

Attributes

dev  [R] 
filename  [R] 

Public Class methods

[Source]

     # 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

Public Instance methods

[Source]

     # File lib/logger.rb, line 508
508:     def close
509:       @mutex.synchronize do
510:         @dev.close
511:       end
512:     end

[Source]

     # 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

Private Instance methods

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # File lib/logger.rb, line 590
590:     def eod(t)
591:       Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
592:     end

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Validate]