yell 0.11.0 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,26 +10,32 @@ module Yell #:nodoc:
10
10
  # The default date pattern, e.g. "19820114" (14 Jan 1982)
11
11
  DefaultDatePattern = "%Y%m%d"
12
12
 
13
- setup do |options|
14
- self.date_pattern = options[:date_pattern] || DefaultDatePattern
15
- self.keep = options[:keep]
13
+ # Metadata
14
+ Metadata = lambda { |date, pattern| "# -*- #{date.iso8601} (#{date.to_f}) [#{pattern}] -*-" }
15
+ MetadataRegexp = /^# -\*- (.+) \((\d+\.\d+)\) \[(.+)\] -\*-$/
16
16
 
17
- @file_basename = options[:filename] || default_filename
18
- options[:filename] = @file_basename
19
17
 
18
+ setup do |options|
20
19
  @date = nil # default; do not override --R
20
+
21
+ self.date_pattern = options.fetch( :date_pattern, DefaultDatePattern )
22
+ self.symlink_original_filename = options.fetch( :symlink_original_filename, false )
23
+ self.keep = options.fetch( :keep, 0 )
24
+
25
+ @original_filename = options.fetch( :filename, default_filename )
26
+ options[:filename] = @original_filename
21
27
  end
22
28
 
23
29
  write do |event|
24
- if close?
25
- close
30
+ return unless close? # do nothing when not closing
31
+ close
26
32
 
27
- unless ::File.exist?( @filename )
28
- cleanup if keep > 0
33
+ return if ::File.exist?( @filename ) # do nothing when file ready present
29
34
 
30
- stream.print( "# -*- #{@date.iso8601} (#{@date.to_f}) [#{date_pattern}] -*-\n" )
31
- end
32
- end
35
+ cleanup! if cleanup?
36
+ symlink_original_filename! if symlink_original_filename
37
+
38
+ stream.puts( Metadata.call(@date, date_pattern) )
33
39
  end
34
40
 
35
41
  close do
@@ -37,20 +43,32 @@ module Yell #:nodoc:
37
43
  end
38
44
 
39
45
 
40
- # Accesor to the date_pattern
46
+ # The pattern to be used for the files
47
+ #
48
+ # @example
49
+ # date_pattern = "%Y%m%d" # default
50
+ # date_pattern = "%Y-week-%V"
41
51
  attr_accessor :date_pattern
42
52
 
43
- # Accessor to keep
44
- attr_reader :keep
53
+ # Tell the adapter to create a symlink onto the currently
54
+ # active (timestamped) file. Upon rollover, the symlink is
55
+ # set to the newly created file, and so on.
56
+ #
57
+ # @example
58
+ # symlink_original_filename = true
59
+ attr_accessor :symlink_original_filename
45
60
 
46
- # Set the amount of logfiles to keep when rolling over
61
+ # Set the amount of logfiles to keep when rolling over.
62
+ # By default, no files will be cleaned up.
47
63
  #
48
64
  # @example Keep the last 5 logfiles
49
65
  # keep = 5
50
66
  # keep = '10'
51
- def keep=( val )
52
- @keep = val.to_i
53
- end
67
+ #
68
+ # @example Do not clean up any files
69
+ # keep = 0
70
+ attr_accessor :keep
71
+
54
72
 
55
73
  private
56
74
 
@@ -60,9 +78,6 @@ module Yell #:nodoc:
60
78
  # If the current time hits the pattern, it closes the file stream.
61
79
  #
62
80
  # @return [Boolean] true or false
63
- #
64
- # TODO: This method causes the datefile adapter to be twice as slow as the file.
65
- # Let's refactor this.
66
81
  def close?
67
82
  _date = Time.now
68
83
 
@@ -75,27 +90,32 @@ module Yell #:nodoc:
75
90
  end
76
91
 
77
92
  # Cleanup old files
78
- def cleanup
79
- files = Dir[ @file_basename.sub( /(\.\w+)?$/, ".*\\1" ) ].map do |f|
93
+ def cleanup!
94
+ files = Dir[ @original_filename.sub( /(\.\w+)?$/, ".*\\1" ) ].map do |f|
80
95
  [ f, metadata_from(f).last ]
81
96
  end.select do |(_, p)|
82
- @date_pattern == p
97
+ date_pattern == p
83
98
  end
84
99
 
85
- ::File.unlink( *files.map(&:first)[0..-(@keep)] )
100
+ ::File.unlink( *files.map(&:first)[0..-keep] )
86
101
  end
87
102
 
88
103
  def cleanup?
89
- !keep
104
+ keep.to_i > 0
105
+ end
106
+
107
+ def symlink_original_filename!
108
+ ::File.unlink( @original_filename ) if ::File.symlink?( @original_filename )
109
+ ::File.symlink( @filename, @original_filename )
90
110
  end
91
111
 
92
112
  # Sets the filename with the `:date_pattern` appended to it.
93
113
  def filename_from( date )
94
- @file_basename.sub( /(\.\w+)?$/, ".#{date.strftime(@date_pattern)}\\1" )
114
+ @original_filename.sub( /(\.\w+)?$/, ".#{date.strftime(date_pattern)}\\1" )
95
115
  end
96
116
 
97
117
  def metadata_from( file )
98
- if m = ::File.open( file, &:readline ).match( /^# -\*- (.+) \((\d+\.\d+)\) \[(.+)\] -\*-$/ )
118
+ if m = ::File.open( file, &:readline ).match( MetadataRegexp )
99
119
  [ Time.at( m[2].to_f ), m[3] ]
100
120
  else
101
121
  [ ::File.mtime( file ), "" ]
@@ -8,7 +8,7 @@ module Yell #:nodoc:
8
8
  class File < Yell::Adapters::Io
9
9
 
10
10
  setup do |options|
11
- @filename = options.fetch(:filename, default_filename)
11
+ @filename = options.fetch( :filename, default_filename )
12
12
  end
13
13
 
14
14
 
data/lib/yell/logger.rb CHANGED
@@ -6,31 +6,31 @@ module Yell #:nodoc:
6
6
  #
7
7
  # A +Yell::Logger+ instance holds all your adapters and sends the log events
8
8
  # to them if applicable. There are multiple ways of how to create a new logger.
9
- #
10
- # @example A standard file logger
11
- # Yell::Logger.new
12
- # Yell::Logger.new 'development.log'
13
- #
14
- # @example A standard datefile logger
15
- # Yell::Logger.new :datefile
16
- # Yell::Logger.new :datefile, 'development.log'
17
- #
18
- # @example Setting the log level
19
- # Yell::Logger.new :level => :warn
20
- #
21
- # Yell::Logger.new do |l|
22
- # l.level = :warn
23
- # end
24
- #
25
- # @example Combined settings
26
- # Yell::Logger.new 'development.log', :level => :warn
27
- #
28
- # Yell::Logger.new :datefile, 'development.log' do |l|
29
- # l.level = :info
30
- # end
31
9
  class Logger
32
10
  include Yell::Level::Helpers
33
11
 
12
+ # Initialize a new Logger
13
+ #
14
+ # @example A standard file logger
15
+ # Yell::Logger.new 'development.log'
16
+ #
17
+ # @example A standard datefile logger
18
+ # Yell::Logger.new :datefile
19
+ # Yell::Logger.new :datefile, 'development.log'
20
+ #
21
+ # @example Setting the log level
22
+ # Yell::Logger.new :level => :warn
23
+ #
24
+ # Yell::Logger.new do |l|
25
+ # l.level = :warn
26
+ # end
27
+ #
28
+ # @example Combined settings
29
+ # Yell::Logger.new 'development.log', :level => :warn
30
+ #
31
+ # Yell::Logger.new :datefile, 'development.log' do |l|
32
+ # l.level = :info
33
+ # end
34
34
  def initialize( *args, &block )
35
35
  @adapters = []
36
36
 
data/lib/yell/version.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module Yell #:nodoc:
4
- VERSION = "0.11.0"
4
+ VERSION = "0.12.0"
5
5
 
6
6
  end
7
7
 
@@ -28,7 +28,7 @@ describe Yell::Adapters::Datefile do
28
28
  let( :tomorrow ) { Time.now + 86400 }
29
29
  let( :tomorrow_datefile_filename ) { fixture_path + "/test.#{tomorrow.strftime(Yell::Adapters::Datefile::DefaultDatePattern)}.log" }
30
30
 
31
- it "should rollover when date has passed" do
31
+ it "should rotate when date has passed" do
32
32
  mock( File ).open( datefile_filename, anything ) { File.new('/dev/null', 'w') }
33
33
  adapter.write( event )
34
34
 
@@ -41,9 +41,9 @@ describe Yell::Adapters::Datefile do
41
41
  end
42
42
 
43
43
  describe :keep do
44
- let( :adapter ) { Yell::Adapters::Datefile.new(:keep => 2, :filename => filename, :date_pattern => "%M" ) }
44
+ let( :adapter ) { Yell::Adapters::Datefile.new(:keep => 2, :filename => filename, :date_pattern => "%M") }
45
45
 
46
- it "should keep the specified number or files upon wollover" do
46
+ it "should keep the specified number or files upon rollover" do
47
47
  adapter.write( event )
48
48
  Dir[ fixture_path + '/*.log' ].size.should == 1
49
49
 
@@ -59,6 +59,27 @@ describe Yell::Adapters::Datefile do
59
59
  end
60
60
  end
61
61
 
62
+ describe :symlink_original_filename do
63
+ let( :adapter ) { Yell::Adapters::Datefile.new(:symlink_original_filename => true, :filename => filename, :date_pattern => "%M") }
64
+ let( :time ) { Time.now }
65
+
66
+ it "should symlink to the orignal given :filename" do
67
+ Timecop.freeze( time ) do
68
+ adapter.write( event )
69
+
70
+ File.symlink?( filename ).should be_true
71
+ File.readlink( filename ).should == datefile_filename( adapter.date_pattern )
72
+ end
73
+
74
+ Timecop.freeze( time + 60 ) do
75
+ adapter.write( event )
76
+
77
+ File.symlink?( filename ).should be_true
78
+ File.readlink( filename ).should == datefile_filename( adapter.date_pattern )
79
+ end
80
+ end
81
+ end
82
+
62
83
 
63
84
  private
64
85
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yell
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.11.0
4
+ version: 0.12.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-21 00:00:00.000000000 Z
12
+ date: 2012-06-29 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Yell - Your Extensible Logging Library. Define multiple adapters, various
15
15
  log level combinations or message formatting options like you've never done before