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

Public Instance methods

[Source]

     # File lib/logger.rb, line 517
517:     def close
518:       @mutex.synchronize do
519:         @dev.close
520:       end
521:     end

[Source]

     # 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

Private Instance methods

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # File lib/logger.rb, line 599
599:     def eod(t)
600:       Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
601:     end

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Source]

     # 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

[Validate]