[Ruby] Класс лог файла

SoNaR sonar at scli.ru
Mon Jun 16 16:10:05 MSD 2003


Hello ruby,

  Есть некоторый класс, который занимается ведением логов. Класс
  представлен ниже:
=begin

= Класс Log

Записывает данные в файл лога, обладает возможностью фиксировать размер лога (в строках),
при этом оставляет только последние n-строк. Сам узнает нужное ему имя лога, хотя можно
задать и произвольное. По умолчанию работает в режиме добавления к имеющемуся логу.

== Константы:

ADD -- данные будут добавляться в конец существующего лога.
NEW -- данные будут писаться в чистый лог.

== Log.new( type = Log::ADD , filename = $0.clone.split('.').first + '.log' )

Констуктор класса

=== Параметры:

type -- тип ведения лога (Log::ADD | Log:: NEW)
filename -- имя файла лога

== log.puts( *str )

Запись данных в лог

=== Параметры:

*str -- данные для записи

== log.clear( nLast4Save = nil )

Очистка лога или обрезание его до нужной длины (в строках).

=== Параметры:

nLast4Save -- количество последних строк которые необходимо оставить в логе, если не 
задана, то очистить лог.

== Примечание:

Все методы возвращают текущий объект, что дает возможность комбинирования
команд в одной строке. Например: Log.new.puts('time: ').clear( 100 )

=end
class Log
        ADD, NEW = true, false

        def initialize( type = Log::ADD , filename = $0.clone.split('.').first + '.log')
                @fname, @attr = filename, File::CREAT | File::WRONLY
                @attr |= (( type )?(File::APPEND):(File::TRUNC))
                self.puts( Time.now.strftime("\nDoW = %w.%W || D = %d/%m/%Y || T = %H:%M")  )
        end
        
        def puts( *str )
                File.open( @fname, @attr ){ |f| f.puts( str ) }
                return self
        end
        
        def clear( nLast4Save = nil )
                attr , flines = File::CREAT | File::WRONLY | File::TRUNC, nil
                if nLast4Save == nil then File.open( @fname , attr ).close
                else
                        File.open( @fname ){ |f| flines = f.readlines }
                        File.open( @fname , attr ){ |f| f.puts( flines.slice(flines.size - nLast4Save , nLast4Save ) ) }
                end
                return self
        end
end

#~ Log.new.puts('other line-1', 'other line-2').clear( 3 )

   Как сделать более корректное обрезание лога (метод clear) до
   нужного кол-ва строк?

-- 
Best regards,
 SoNaR                          mailto:sonar at scli.ru



More information about the Ruby mailing list