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 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

Public Instance methods

[Source]

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

[Source]

     # 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

Private Instance methods

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Validate]