Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > my logroll code, please critique

Reply
Thread Tools

my logroll code, please critique

 
 
Derek Smith
Guest
Posts: n/a
 
      05-05-2009
My goal is to keep 10 files each at 100Mb. Please critique and suggest
any corrections I need to make. Thank you!



#!/usr/bin/ruby -w -W 2

require 'ftools'
require 'fileutils'

=begin
#-----------------------------
File::LOCK_SH # shared lock (for reading)
File::LOCK_EX # exclusive lock (for writing)
File::LOCK_NB # non-blocking request
File::LOCK_UN # free lock
#-----------------------------
=end


###-- 10 files at 100Mb before rolling begins ---##

FSIZE = 104860000

Dir.chdir("/cygdrive/c/temp/log") \
or raise StandardError, "Change dir failed to ~aevrlog!"

unless File.exists?("/cygdrive/c/temp/log/zipped")
File.makedirs("zipped") \
or raise StandardError, "Make dir failed to ~aevrlog/zipped!"
end

array1 = Dir.glob("dev*.log")
array2 = Dir.glob("mon*.log")
array3 = Dir.glob("fer*_se*.out")
array4 = Dir.glob("fer*_se*.log")
array5 = Dir.glob("fer*_in*.log")

if (array1.length >= 1)
array1.each { |file|

if (File.size(file) > FSIZE)
`/usr/bin/gzip "#{file}"`
FileUtils.mv("#{file}.gz","/cygdrive/c/temp/log/zipped")
FileUtils.touch("development.log")
end
}
end

Dir.chdir("/cygdrive/c/temp/log/zipped") \
or raise StandardError, "Change dir failed to ~aevrlog!"

array1_1 = Dir["/cygdrive/c/temp/log/zipped/dev*.gz"]

if (array1_1.length >= 1)
if File.exists?("development.log.11.gz")
FileUtils.rm_r
Dir.glob("/cygdrive/c/temp/log/zipped/dev*11.gz")
end
if File.exists?("development.log.10.gz")
File.copy("development.log.10.gz", "development.log.11.gz")
end
if File.exists?("development.log.8.gz")
File.copy("development.log.8.gz", "development.log.9.gz")
end
if File.exists?("development.log.7.gz")
File.copy("development.log.7.gz", "development.log.8.gz")
end
if File.exists?("development.log.6.gz")
File.copy("development.log.6.gz", "development.log.7.gz")
end
if File.exists?("development.log.5.gz")
File.copy("development.log.5.gz", "development.log.6.gz")
end
if File.exists?("development.log.4.gz")
File.copy("development.log.4.gz", "development.log.5.gz")
end
if File.exists?("development.log.3.gz")
File.copy("development.log.3.gz", "development.log.4.gz")
end
if File.exists?("development.log.2.gz")
File.copy("development.log.2.gz", "development.log.3.gz")
end
if File.exists?("development.log.1.gz")
File.copy("development.log.1.gz", "development.log.2.gz")
end
if File.exists?("development.log.gz")
File.copy("development.log.gz", "development.log.1.gz")
end
end
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
 
 
 
matt neuburg
Guest
Posts: n/a
 
      05-05-2009
Derek Smith <(E-Mail Removed)> wrote:

> if File.exists?("development.log.10.gz")
> File.copy("development.log.10.gz", "development.log.11.gz")
> end
> if File.exists?("development.log.8.gz")
> File.copy("development.log.8.gz", "development.log.9.gz")
> end
> # etc, over and over and over and over


You forgot log.9, and the very fact that this can happen, along with the
patterned repetition here, would appear to be a Bad Smell (as in
"Refactoring"). Why 30 hard-coded lines when a 5-line loop will do? m.

--
matt neuburg, phd = http://www.velocityreviews.com/forums/(E-Mail Removed), http://www.tidbits.com/matt/
Leopard - http://www.takecontrolbooks.com/leop...stomizing.html
AppleScript - http://www.amazon.com/gp/product/0596102119
Read TidBITS! It's free and smart. http://www.tidbits.com
 
Reply With Quote
 
 
 
 
Robert Klemme
Guest
Posts: n/a
 
      05-05-2009
On 05.05.2009 03:52, matt neuburg wrote:
> Derek Smith <(E-Mail Removed)> wrote:
>
>> if File.exists?("development.log.10.gz")
>> File.copy("development.log.10.gz", "development.log.11.gz")
>> end
>> if File.exists?("development.log.8.gz")
>> File.copy("development.log.8.gz", "development.log.9.gz")
>> end
>> # etc, over and over and over and over

>
> You forgot log.9, and the very fact that this can happen, along with the
> patterned repetition here, would appear to be a Bad Smell (as in
> "Refactoring"). Why 30 hard-coded lines when a 5-line loop will do? m.


Another thing that struck me is the usage of File.copy. File.rename
would be much more efficient plus it would not change the last
modification time of the file.

Kind regards

robert
 
Reply With Quote
 
Tom Cloyd
Guest
Posts: n/a
 
      05-05-2009
Derek Smith wrote:
> My goal is to keep 10 files each at 100Mb. Please critique and suggest
> any corrections I need to make. Thank you!
>
>
>
> #!/usr/bin/ruby -w -W 2
>
> require 'ftools'
> require 'fileutils'
>
> =begin
> #-----------------------------
> File::LOCK_SH # shared lock (for reading)
> File::LOCK_EX # exclusive lock (for writing)
> File::LOCK_NB # non-blocking request
> File::LOCK_UN # free lock
> #-----------------------------
> =end
>
>
> ###-- 10 files at 100Mb before rolling begins ---##
>
> FSIZE = 104860000
>
> Dir.chdir("/cygdrive/c/temp/log") \
> or raise StandardError, "Change dir failed to ~aevrlog!"
>
> unless File.exists?("/cygdrive/c/temp/log/zipped")
> File.makedirs("zipped") \
> or raise StandardError, "Make dir failed to ~aevrlog/zipped!"
> end
>
> array1 = Dir.glob("dev*.log")
> array2 = Dir.glob("mon*.log")
> array3 = Dir.glob("fer*_se*.out")
> array4 = Dir.glob("fer*_se*.log")
> array5 = Dir.glob("fer*_in*.log")
>
> if (array1.length >= 1)
> array1.each { |file|
>
> if (File.size(file) > FSIZE)
> `/usr/bin/gzip "#{file}"`
> FileUtils.mv("#{file}.gz","/cygdrive/c/temp/log/zipped")
> FileUtils.touch("development.log")
> end
> }
> end
>
> Dir.chdir("/cygdrive/c/temp/log/zipped") \
> or raise StandardError, "Change dir failed to ~aevrlog!"
>
> array1_1 = Dir["/cygdrive/c/temp/log/zipped/dev*.gz"]
>
> if (array1_1.length >= 1)
> if File.exists?("development.log.11.gz")
> FileUtils.rm_r
> Dir.glob("/cygdrive/c/temp/log/zipped/dev*11.gz")
> end
> if File.exists?("development.log.10.gz")
> File.copy("development.log.10.gz", "development.log.11.gz")
> end
> if File.exists?("development.log.8.gz")
> File.copy("development.log.8.gz", "development.log.9.gz")
> end
> if File.exists?("development.log.7.gz")
> File.copy("development.log.7.gz", "development.log.8.gz")
> end
> if File.exists?("development.log.6.gz")
> File.copy("development.log.6.gz", "development.log.7.gz")
> end
> if File.exists?("development.log.5.gz")
> File.copy("development.log.5.gz", "development.log.6.gz")
> end
> if File.exists?("development.log.4.gz")
> File.copy("development.log.4.gz", "development.log.5.gz")
> end
> if File.exists?("development.log.3.gz")
> File.copy("development.log.3.gz", "development.log.4.gz")
> end
> if File.exists?("development.log.2.gz")
> File.copy("development.log.2.gz", "development.log.3.gz")
> end
> if File.exists?("development.log.1.gz")
> File.copy("development.log.1.gz", "development.log.2.gz")
> end
> if File.exists?("development.log.gz")
> File.copy("development.log.gz", "development.log.1.gz")
> end
> end
>

Derek, I'm interested in what your trying to do here, and in the
comments it's elicited. Could you share you revised code, when it's
ready (or backchannel it, if you wish). I could definitely USE this!

Tom

 
Reply With Quote
 
Tim Pease
Guest
Posts: n/a
 
      05-05-2009
On Tue, May 5, 2009 at 2:55 AM, Tom Cloyd <(E-Mail Removed)> wrote:
> Derek Smith wrote:
>>
>> My goal is to keep 10 files each at 100Mb. Please critique and suggest
>> any corrections I need to make. =A0Thank you!
>>
>>
>>

>
> Derek, I'm interested in what your trying to do here, and in the comments
> it's elicited. Could you share you revised code, when it's ready (or
> backchannel it, if you wish). I could definitely USE this!
>


Take a look at the "logging" gem. The RollingFile appender will do
exactly this -- rolling files based on size or age. Moreover, it will
safely roll the files even if multiple processes are writing to the
same file.

rubyforge.org/projects/logging

Blessings,
TwP

 
Reply With Quote
 
Derek Smith
Guest
Posts: n/a
 
      05-05-2009
Tim Pease wrote:
> On Tue, May 5, 2009 at 2:55 AM, Tom Cloyd <(E-Mail Removed)> wrote:
>> backchannel it, if you wish). I could definitely USE this!
>>

>
> Take a look at the "logging" gem. The RollingFile appender will do
> exactly this -- rolling files based on size or age. Moreover, it will
> safely roll the files even if multiple processes are writing to the
> same file.
>
> rubyforge.org/projects/logging
>
> Blessings,
> TwP


I did look into this gem, but the documentation was weak and I tried to
work it, but could not and failed so I wrote my own since I am new to
Ruby. A good learning exp!....yucky Perl, ugly code is not for me!

Will anyone share good sample code for logging?
Thanks to all that replied, but Matt will you show me this loop you
referred to?


Thank you!
--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Eric Hodel
Guest
Posts: n/a
 
      05-05-2009
On May 5, 2009, at 15:44, Derek Smith wrote:
> Tim Pease wrote:
>> On Tue, May 5, 2009 at 2:55 AM, Tom Cloyd <(E-Mail Removed)>
>> wrote:
>>> backchannel it, if you wish). I could definitely USE this!
>>>

>>
>> Take a look at the "logging" gem. The RollingFile appender will do
>> exactly this -- rolling files based on size or age. Moreover, it will
>> safely roll the files even if multiple processes are writing to the
>> same file.
>>
>> rubyforge.org/projects/logging
>>
>> Blessings,
>> TwP

>
> I did look into this gem, but the documentation was weak and I tried
> to
> work it, but could not and failed so I wrote my own since I am new to
> Ruby. A good learning exp!....yucky Perl, ugly code is not for me!
>
> Will anyone share good sample code for logging?
> Thanks to all that replied, but Matt will you show me this loop you
> referred to?


I use SyslogLogger (which adapts Syslog to a Logger API) and newsyslog
to rotate logs.

 
Reply With Quote
 
Joel VanderWerf
Guest
Posts: n/a
 
      05-05-2009
Derek Smith wrote:
> Will anyone share good sample code for logging?


There's the logger.rb in the ruby standard library (or did someone
mention that already?). It handles rotation, log levels, but perhaps not
multiprocess safety.

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

 
Reply With Quote
 
Derek Smith
Guest
Posts: n/a
 
      05-06-2009
Joel VanderWerf wrote:
> Derek Smith wrote:
>> Will anyone share good sample code for logging?

>
> There's the logger.rb in the ruby standard library (or did someone
> mention that already?). It handles rotation, log levels, but perhaps not
> multiprocess safety.


Here is my updated code, but how do I look at the documentation from the
CLI for logger, logging or any gem? For example, if I want to look at
Perl docs I use perldoc -f "builtin function" or perldoc -q "F.A.Q."
Finally, what about a central logging block for when at anytime 'raise
StandardError' is called, the script will log to one logfile. Will
anyone suggest code or how to do this?


thank you!


#!/usr/bin/ruby -w -W 2

require 'ftools'
require 'fileutils'

=begin
#-----------------------------
File::LOCK_SH # shared lock (for reading)
File::LOCK_EX # exclusive lock (for writing)
File::LOCK_NB # non-blocking request
File::LOCK_UN # free lock
#-----------------------------
=end


###-- 10 files at 100Mb before rolling begins ---##

FSIZE = 104860000

Dir.chdir("/cygdrive/c/temp/log") \
or raise StandardError, "Change dir failed to ~aevrlog!"

unless File.exists?("/cygdrive/c/temp/log/zipped")
File.makedirs("zipped") \
or raise StandardError, "Make dir failed to ~aevrlog/zipped!"
end

array1 = Dir.glob("dev*.log")
array2 = Dir.glob("mon*.log")
array3 = Dir.glob("fer*_se*.out")
array4 = Dir.glob("fer*_se*.log")
array5 = Dir.glob("fer*_in*.log")

if (array1.length >= 1)
array1.each { |file|

if (File.size(file) > FSIZE)
File.open(file, "r+") do |f|
if (f.flock(File::LOCK_SH)) == 0
`/usr/bin/gzip "#{file}"`
FileUtils.mv("#{file}.gz","/cygdrive/c/temp/log/zipped")
end
end
FileUtils.touch("development.log")
end
}
end

Dir.chdir("/cygdrive/c/temp/log/zipped") \
or raise StandardError, "Change dir failed to ~aevrlog!"

array1_1 = Dir["/cygdrive/c/temp/log/zipped/dev*.gz"]

if (array1_1.length >= 1)
if File.exists?("development.log.11.gz")
FileUtils.rm_r
Dir.glob("/cygdrive/c/temp/log/zipped/dev*11.gz")
end
if File.exists?("development.log.10.gz")
File.rename("development.log.10.gz",
"development.log.11.gz")
end
if File.exists?("development.log.9.gz")
File.rename("development.log.9.gz", "development.log.10.gz")
end
if File.exists?("development.log.8.gz")
File.rename("development.log.8.gz", "development.log.9.gz")
end
if File.exists?("development.log.7.gz")
File.rename("development.log.7.gz", "development.log.8.gz")
end
if File.exists?("development.log.6.gz")
File.rename("development.log.6.gz", "development.log.7.gz")
end
if File.exists?("development.log.5.gz")
File.rename("development.log.5.gz", "development.log.6.gz")
end
if File.exists?("development.log.4.gz")
File.rename("development.log.4.gz", "development.log.5.gz")
end
if File.exists?("development.log.3.gz")
File.rename("development.log.3.gz", "development.log.4.gz")
end
if File.exists?("development.log.2.gz")
File.rename("development.log.2.gz", "development.log.3.gz")
end
if File.exists?("development.log.1.gz")
File.rename("development.log.1.gz", "development.log.2.gz")
end
if File.exists?("development.log.gz")
File.rename("development.log.gz", "development.log.1.gz")
end
end

--
Posted via http://www.ruby-forum.com/.

 
Reply With Quote
 
Joel VanderWerf
Guest
Posts: n/a
 
      05-06-2009
Derek Smith wrote:
> Here is my updated code, but how do I look at the documentation from the
> CLI for logger, logging or any gem? For example, if I want to look at
> Perl docs I use perldoc -f "builtin function" or perldoc -q "F.A.Q."


http://www.ruby-doc.org/stdlib/

Look in the left panel for "logger".

This site is still pretty useful (though I don't know if it is
frequently updated).

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Critique food site please Nik Coughlin HTML 33 03-06-2006 07:15 AM
Feedback/critique my website please? Familyman HTML 24 02-12-2006 02:21 AM
Please critique this HTA (Change Database Remotely) Highlander HTML 9 12-07-2005 06:41 AM
critique these sites please Developwebsites HTML 15 09-20-2004 10:49 PM
edgesoft.ca site critique please Long HTML 5 10-21-2003 09:18 PM



Advertisments