/
alogr.rb
89 lines (69 loc) · 2.07 KB
/
alogr.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
require "aio_logger"
module AlogR
Levels = { :emergency => 0, :alert => 1, :critical => 2, :error => 3, :warning => 4, :notice => 5, :info => 6, :debug => 7 }
class Logger
class << self
attr_accessor :config
def log( string, level = ( config[:default_log_level] || :info ) )
level = AlogR::Levels[level] if AlogR::Levels.has_key?( level )
$alogr_buffer << [config[:newline] ? (string << "\n") : string, level]
end
def method_missing( method, *options )
if AlogR::Levels.include?( method )
log( method, options.first )
else
super.method_missing( method, *options )
end
end
end
def initialize( options = {} )
if options.class == String
options = { :log => options }
elsif options.class == Hash
options[:log] ||= "log/default.log"
else
raise "AlogR: Invalid configuration"
end
config = options
AlogR::Levels.keys.each do | key |
file_name = options[key] || options[:log]
$alogr_log_files[AlogR::Levels[key]] = file_name.freeze
# TODO: Verifiy valid filename, if not raise an error
system("mkdir -p #{File.dirname(file_name)} ; touch #{file_name}")
end
Object.logger = self # This becomes the default logger
Thread.abort_on_exception = true
Thread.new do
loop do
sleep( config[:log_interval] || 0.25 )
flush_log_buffer
end
Thread.exit
end
self
end
end
end
class Object
class << self
attr_accessor :logger
end
def log(*args) # level = :info
Object.logger ||= AlogR::Logger.new
if self.class == String
require "ruby-debug" and debugger
level = args.first || :info
unless AlogR::Levels[level].nil?
Object.logger.log(self, AlogR::Levels[level])
else
raise "Error: No such level: #{level}"
end
else
self.to_s.log
end
self
end
end
at_exit do
sleep(1) # Allow log buffer to get emptied
end