pmux-logview 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. data/Gemfile +4 -0
  2. data/LICENSE.txt +22 -0
  3. data/Makefile +18 -0
  4. data/README.md +113 -0
  5. data/Rakefile +4 -0
  6. data/bin/pmux-logview +4 -0
  7. data/conf/config.ru +15 -0
  8. data/conf/password +5 -0
  9. data/conf/pmux-logview.conf +12 -0
  10. data/lib/pmux-logview.rb +11 -0
  11. data/lib/pmux-logview/application.rb +69 -0
  12. data/lib/pmux-logview/auth_helper.rb +60 -0
  13. data/lib/pmux-logview/controller.rb +141 -0
  14. data/lib/pmux-logview/log_parser.rb +368 -0
  15. data/lib/pmux-logview/logger_wrapper.rb +129 -0
  16. data/lib/pmux-logview/model.rb +21 -0
  17. data/lib/pmux-logview/static/css/images/animated-overlay.gif +0 -0
  18. data/lib/pmux-logview/static/css/images/ui-bg_diagonals-thick_90_eeeeee_40x40.png +0 -0
  19. data/lib/pmux-logview/static/css/images/ui-bg_flat_15_cd0a0a_40x100.png +0 -0
  20. data/lib/pmux-logview/static/css/images/ui-bg_glass_100_e4f1fb_1x400.png +0 -0
  21. data/lib/pmux-logview/static/css/images/ui-bg_glass_50_3baae3_1x400.png +0 -0
  22. data/lib/pmux-logview/static/css/images/ui-bg_glass_80_d7ebf9_1x400.png +0 -0
  23. data/lib/pmux-logview/static/css/images/ui-bg_highlight-hard_100_f2f5f7_1x100.png +0 -0
  24. data/lib/pmux-logview/static/css/images/ui-bg_highlight-hard_70_000000_1x100.png +0 -0
  25. data/lib/pmux-logview/static/css/images/ui-bg_highlight-soft_100_deedf7_1x100.png +0 -0
  26. data/lib/pmux-logview/static/css/images/ui-bg_highlight-soft_25_ffef8f_1x100.png +0 -0
  27. data/lib/pmux-logview/static/css/images/ui-icons_2694e8_256x240.png +0 -0
  28. data/lib/pmux-logview/static/css/images/ui-icons_2e83ff_256x240.png +0 -0
  29. data/lib/pmux-logview/static/css/images/ui-icons_3d80b3_256x240.png +0 -0
  30. data/lib/pmux-logview/static/css/images/ui-icons_72a7cf_256x240.png +0 -0
  31. data/lib/pmux-logview/static/css/images/ui-icons_ffffff_256x240.png +0 -0
  32. data/lib/pmux-logview/static/css/jquery-ui-1.10.0.css +1186 -0
  33. data/lib/pmux-logview/static/css/jquery.dataTables.css +221 -0
  34. data/lib/pmux-logview/static/css/normalize.css +396 -0
  35. data/lib/pmux-logview/static/css/pmux-logview.css +161 -0
  36. data/lib/pmux-logview/static/css/tchart.css +124 -0
  37. data/lib/pmux-logview/static/font/7TssRTXcaLr8beqDiv5lkQ.woff +0 -0
  38. data/lib/pmux-logview/static/images/back_disabled.png +0 -0
  39. data/lib/pmux-logview/static/images/back_enabled.png +0 -0
  40. data/lib/pmux-logview/static/images/back_enabled_hover.png +0 -0
  41. data/lib/pmux-logview/static/images/forward_disabled.png +0 -0
  42. data/lib/pmux-logview/static/images/forward_enabled.png +0 -0
  43. data/lib/pmux-logview/static/images/forward_enabled_hover.png +0 -0
  44. data/lib/pmux-logview/static/images/sort_asc.png +0 -0
  45. data/lib/pmux-logview/static/images/sort_asc_disabled.png +0 -0
  46. data/lib/pmux-logview/static/images/sort_both.png +0 -0
  47. data/lib/pmux-logview/static/images/sort_desc.png +0 -0
  48. data/lib/pmux-logview/static/images/sort_desc_disabled.png +0 -0
  49. data/lib/pmux-logview/static/js/d3.v3.min.js +4 -0
  50. data/lib/pmux-logview/static/js/jquery-1.9.1.js +9597 -0
  51. data/lib/pmux-logview/static/js/jquery-ui-1.10.0.js +14883 -0
  52. data/lib/pmux-logview/static/js/jquery.activity-indicator-1.0.0.min.js +10 -0
  53. data/lib/pmux-logview/static/js/jquery.dataTables.min.js +157 -0
  54. data/lib/pmux-logview/static/js/pmux-logview-base.js +102 -0
  55. data/lib/pmux-logview/static/js/pmux-logview-detail.js +181 -0
  56. data/lib/pmux-logview/static/js/pmux-logview-index.js +324 -0
  57. data/lib/pmux-logview/static/js/tchart.js +2125 -0
  58. data/lib/pmux-logview/version.rb +5 -0
  59. data/lib/pmux-logview/views/detail.erb +58 -0
  60. data/lib/pmux-logview/views/index.erb +97 -0
  61. data/pmux-logview.gemspec +27 -0
  62. data/rpm/Makefile +20 -0
  63. data/rpm/pmux-logview +111 -0
  64. data/rpm/pmux-logview.spec +65 -0
  65. metadata +224 -0
@@ -0,0 +1,368 @@
1
+ require 'fileutils'
2
+ require 'date'
3
+ require 'yaml'
4
+
5
+ module Pmux
6
+ module LogView
7
+ class LogParser
8
+ @@pmux_log_path = ".pmux/log"
9
+ @@pmux_old_log_path = ".pmux/log/old"
10
+ @@dispatcher_log = "dispatcher.log"
11
+ @@max_dispatcher_log_size = 1024 * 64 # 128k
12
+
13
+ @@document_re = Regexp.new("^---")
14
+ @@header_re = Regexp.new("^:[a-z_]+:")
15
+ @@header_params_re = Regexp.new("^ :[a-z_]+:")
16
+ @@task_re = Regexp.new(" [a-z_]+:")
17
+ @@futter_re = Regexp.new("^:[a-z_]+:")
18
+ @@mapper_re = Regexp.new("^:mapper:")
19
+ @@job_started_at_re = Regexp.new("^:job_started_at:")
20
+ @@start_time_re = Regexp.new("^:start_time:")
21
+ @@invoked_at_re = Regexp.new("^:invoked_at:")
22
+ @@map_tasks_re = Regexp.new("^:map_tasks:")
23
+ @@tasksize_re = Regexp.new("^:tasksize:")
24
+ @@reduce_tasks_re = Regexp.new("^:reduce_tasks:")
25
+ @@params_re = Regexp.new("^:params:")
26
+ @@task_id_re = Regexp.new("^[0-9]+:")
27
+ @@task_allocated_at_re = Regexp.new("^ allocated_at:")
28
+ @@task_welapse_re = Regexp.new("^ welapse:")
29
+ @@task_elapse_re = Regexp.new("^ elapse:")
30
+ @@job_finished_at_re = Regexp.new("^:job_finished_at:")
31
+ @@quote_re = Regexp.new("^['\"]|['\"]$")
32
+
33
+ @logger = nil
34
+
35
+ def initialize cache_dir_path
36
+ @cache_dir_path = cache_dir_path
37
+ @logger = LoggerWrapper.instance()
38
+ end
39
+
40
+ def get_files user, log_path
41
+ return Dir.glob(File.expand_path(["~" + user, log_path, "*.yml"].join(File::SEPARATOR)))
42
+ end
43
+
44
+ def fast_parse file, job_id
45
+ cachable = false
46
+ job = {"end_time" => nil, "elapsed_time" => nil, "finished_tasks" => 0}
47
+ job["job_id"] = job_id
48
+ task_cnt = 0
49
+ start_time = nil
50
+ end_time = nil
51
+ File.open(file) {|f|
52
+ doc_cnt = 0
53
+ f.each_line {|ln|
54
+ if @@document_re =~ ln
55
+ doc_cnt += 1
56
+ elsif doc_cnt == 1 && (@@job_started_at_re =~ ln || @@start_time_re =~ ln)
57
+ empty, key, value = ln.split(":", 3)
58
+ start_time = DateTime::parse(value.strip())
59
+ job["start_time_msec"] = start_time.strftime("%Q")
60
+ job["start_time"] = start_time.strftime("%Y-%m-%d %H:%M:%S")
61
+ elsif doc_cnt == 1 && @@map_tasks_re =~ ln
62
+ empty, key, value = ln.split(":", 3)
63
+ job[key] = value.strip().to_i()
64
+ elsif doc_cnt == 1 && @@mapper_re =~ ln
65
+ empty, key, value = ln.split(":", 3)
66
+ job[key] = value.strip()
67
+ elsif doc_cnt == 2 && @@task_id_re =~ ln
68
+ task_cnt += 1
69
+ elsif doc_cnt == 3 && @@job_finished_at_re =~ ln
70
+ empty, key, value = ln.split(":", 3)
71
+ end_time = DateTime::parse(value.strip())
72
+ job["end_time_msec"] = end_time.strftime("%Q")
73
+ job["end_time"] = end_time.strftime("%Y-%m-%d %H:%M:%S")
74
+ cachable = true
75
+ end
76
+ }
77
+ }
78
+ job["finished_tasks"] = task_cnt
79
+ job["elapsed_time"] = ((end_time - start_time) * 86400).to_f if !start_time.nil? && !end_time.nil?
80
+ if end_time.nil?
81
+ if job["map_tasks"].nil?
82
+ job["end_time"] = "--- %"
83
+ elsif job["map_tasks"] == 0
84
+ job["end_time"] = "100%"
85
+ else
86
+ job["end_time"] = ((100 * job["finished_tasks"]) / job["map_tasks"]).to_s + "%"
87
+ end
88
+ end
89
+ return [job, cachable]
90
+ end
91
+
92
+ def load_cache file_path
93
+ cache = {}
94
+ return cache if !File.exist?(file_path)
95
+ begin
96
+ File.open(file_path, "rb") {|f|
97
+ f.flock(File::LOCK_SH)
98
+ cache = Marshal.load(f)
99
+ f.flock(File::LOCK_UN)
100
+ }
101
+ return cache
102
+ rescue
103
+ @logger.warn("cannot load cache file (#{file_path})")
104
+ return cache
105
+ end
106
+ end
107
+
108
+ def save_cache file_path, jobs, cachable_ids
109
+ cache = {}
110
+ for job_id in cachable_ids
111
+ cache[job_id] = jobs[job_id]
112
+ end
113
+ FileUtils.mkdir_p(@cache_dir_path) if !File.exist?(@cache_dir_path)
114
+ begin
115
+ File.open(file_path, File::RDWR|File::CREAT, 0644) {|f|
116
+ f.flock(File::LOCK_EX)
117
+ f.rewind()
118
+ Marshal.dump(cache, f)
119
+ f.flush()
120
+ f.truncate(f.pos)
121
+ f.flock(File::LOCK_UN)
122
+ }
123
+ rescue
124
+ @logger.warn("cannot save cache file (#{file_path})")
125
+ end
126
+ end
127
+
128
+ def add_cache_ids cache_ids, jobs, job_id, job, sort_key, sort_order
129
+ insert_idx = -1
130
+ for idx in 0..(cache_ids.length - 1)
131
+ id = cache_ids[idx]
132
+ if sort_order == "desc"
133
+ case sort_key
134
+ when "start_time"
135
+ if job["start_time_msec"].to_i > jobs[id]["start_time_msec"].to_i
136
+ insert_idx = idx
137
+ break
138
+ end
139
+ when "job_id"
140
+ if job["job_id"].to_i > jobs[id]["job_id"].to_i
141
+ insert_idx = idx
142
+ break
143
+ end
144
+ when "mapper"
145
+ if job["mapper"] > jobs[id]["mapper"]
146
+ insert_idx = idx
147
+ break
148
+ end
149
+ when "end_time"
150
+ if job["end_time_msec"].to_i > jobs[id]["end_time_msec"].to_i
151
+ insert_idx = idx
152
+ break
153
+ end
154
+ when "elapsed_time"
155
+ if job["elapsed_time"].to_i > jobs[id]["elapsed_time"].to_i
156
+ insert_idx = idx
157
+ break
158
+ end
159
+ end
160
+ elsif sort_order == "asc"
161
+ case sort_key
162
+ when "start_time"
163
+ if job["start_time_msec"].to_i < jobs[id]["start_time_msec"].to_i
164
+ insert_idx = idx
165
+ break
166
+ end
167
+ when "job_id"
168
+ if job["job_id"].to_i < jobs[id]["job_id"].to_i
169
+ insert_idx = idx
170
+ break
171
+ end
172
+ when "mapper"
173
+ if job["mapper"] < jobs[id]["mapper"]
174
+ insert_idx = idx
175
+ break
176
+ end
177
+ when "end_time"
178
+ if job["end_time_msec"].to_i < jobs[id]["end_time_msec"].to_i
179
+ insert_idx = idx
180
+ break
181
+ end
182
+ when "elapsed_time"
183
+ if job["elapsed_time"].to_i < jobs[id]["elapsed_time"].to_i
184
+ insert_idx = idx
185
+ break
186
+ end
187
+ end
188
+ end
189
+ end
190
+ if insert_idx != -1
191
+ cache_ids.insert(insert_idx, job_id);
192
+ else
193
+ cache_ids.push(job_id)
194
+ end
195
+ end
196
+
197
+ def parse_data_cache_ids parse_data, jobs, cache_ids, nitems, page
198
+ start_idx = nitems * page
199
+ if start_idx >= (cache_ids.length - 1)
200
+ return
201
+ end
202
+ for idx in start_idx..cache_ids.length - 1
203
+ parse_data[cache_ids[idx]] = jobs[cache_ids[idx]]
204
+ nitems -= 1
205
+ if nitems == 0
206
+ break
207
+ end
208
+ end
209
+ end
210
+
211
+ def parse_log_job user, data
212
+ new_jobs_cookie = DateTime.now().strftime("%Q").to_i
213
+ jobs = {}
214
+ new_cache_ids = []
215
+ update_ids = []
216
+ cache_file_path = [@cache_dir_path, user].join(File::SEPARATOR)
217
+ cache = load_cache(cache_file_path)
218
+ need_save_cache = false
219
+ for log_path in [@@pmux_log_path]
220
+ files = get_files(user, log_path)
221
+ for file in files
222
+ job_id = File::basename(file).sub(".yml", "")
223
+ if cache.key?(job_id)
224
+ jobs[job_id] = cache[job_id]
225
+ add_cache_ids(new_cache_ids, jobs, job_id, cache[job_id], data["sort_key"], data["sort_order"])
226
+ update_ids.push(job_id) if data["jobs_cookie"] > 0 && data["jobs_cookie"] <= cache[job_id]["end_time_msec"].to_i
227
+ next
228
+ else
229
+ job, cachable = fast_parse(file, job_id)
230
+ jobs[job_id] = job
231
+ update_ids.push(job_id)
232
+ if cachable
233
+ add_cache_ids(new_cache_ids, jobs, job_id, job, data["sort_key"], data["sort_order"])
234
+ need_save_cache = true
235
+ end
236
+ end
237
+ end
238
+ end
239
+ save_cache(cache_file_path, jobs, new_cache_ids) if need_save_cache || cache.length != new_cache_ids.length
240
+ parse_data = { "jobs" => {}, "jobs_cookie" => new_jobs_cookie}
241
+ if data["type"] == "archive"
242
+ parse_data_cache_ids(parse_data["jobs"], jobs, new_cache_ids, data["nitems"], data["page"])
243
+ end
244
+ for job_id in update_ids
245
+ parse_data["jobs"][job_id] = jobs[job_id] if jobs.key?(job_id)
246
+ end
247
+ return parse_data
248
+ end
249
+
250
+ def full_parse file_path
251
+ documents = []
252
+ File.open(file_path) {|f|
253
+ doc_cnt = 0
254
+ new_doc = nil
255
+ task_id = nil
256
+ f.each_line {|ln|
257
+ if @@document_re =~ ln
258
+ if !new_doc.nil?
259
+ new_doc.delete(task_id) if doc_cnt == 2 && !task_id.nil? && new_doc[task_id].length < 5
260
+ documents.push(new_doc)
261
+ end
262
+ doc_cnt += 1
263
+ new_doc = {}
264
+ task_id = nil
265
+ elsif doc_cnt == 1 && (@@job_started_at_re =~ ln || @@invoked_at_re =~ ln || @@start_time_re =~ ln)
266
+ empty, key, value = ln.split(":", 3)
267
+ time = DateTime::parse(value.strip())
268
+ new_doc[key] = time
269
+ elsif doc_cnt == 1 && (@@map_tasks_re =~ ln || @@tasksize_re =~ ln || @@reduce_tasks_re =~ ln)
270
+ empty, key, value = ln.split(":", 3)
271
+ new_doc[key] = value.strip().to_i()
272
+ elsif doc_cnt == 1 && @@params_re =~ ln
273
+ empty, key, value = ln.split(":", 3)
274
+ new_doc["params"] = {}
275
+ elsif doc_cnt == 1 && @@header_re =~ ln
276
+ empty, key, value = ln.split(":", 3)
277
+ new_doc[key] = value.strip().gsub(@@quote_re, "")
278
+ elsif doc_cnt == 1 && @@header_params_re =~ ln
279
+ empty, key, value = ln.split(":", 3)
280
+ new_doc["params"][key] = value.strip().gsub(@@quote_re, "")
281
+ elsif doc_cnt == 2 && @@task_id_re =~ ln
282
+ task_id, empty = ln.split(":", 2)
283
+ new_doc[task_id] = {}
284
+ elsif doc_cnt == 2 && (@@task_allocated_at_re =~ ln || @@task_welapse_re =~ ln || @@task_elapse_re =~ ln)
285
+ key, value = ln.split(":", 2)
286
+ new_doc[task_id][key.strip()] = value.strip().to_f()
287
+ elsif doc_cnt == 2 && @@task_re =~ ln
288
+ key, value = ln.split(":", 2)
289
+ new_doc[task_id][key.strip()] = value.strip().gsub(@@quote_re, "")
290
+ elsif doc_cnt == 3 && @@job_finished_at_re =~ ln
291
+ empty, key, value = ln.split(":", 3)
292
+ time = DateTime::parse(value.strip())
293
+ new_doc[key] = time
294
+ elsif doc_cnt == 3 && @@futter_re =~ ln
295
+ empty, key, value = ln.split(":", 3)
296
+ new_doc[key] = value.strip().gsub(@@quote_re, "")
297
+ end
298
+ }
299
+ if !new_doc.nil?
300
+ new_doc.delete(task_id) if doc_cnt == 2 && new_doc[task_id].length < 5
301
+ documents.push(new_doc)
302
+ end
303
+ if documents.length == 1
304
+ documents.push(nil)
305
+ end
306
+ if documents.length == 2
307
+ documents.push(nil)
308
+ end
309
+ }
310
+ return documents
311
+ end
312
+
313
+ def parse_log_job_detail user, job_id
314
+ file_path = File.expand_path(["~" + user, @@pmux_log_path, job_id + ".yml"].join(File::SEPARATOR))
315
+ if !File.exist?(file_path)
316
+ file_path = File.expand_path(["~" + user, @@pmux_old_log_path, job_id + ".yml"].join(File::SEPARATOR))
317
+ if !File.exist?(file_path)
318
+ return nil
319
+ end
320
+ end
321
+ #begin
322
+ #f = File.open(file_path)
323
+ #docs = YAML::load_stream(f)
324
+ docs = full_parse(file_path)
325
+ parse_data = []
326
+ for idx in [0, 1, 2]
327
+ if idx == 0 && !docs[idx].nil?
328
+ docs[idx]["job_started_at_msec"] = docs[idx]["job_started_at"].strftime("%Q") if !docs[idx]["job_started_at"].nil?
329
+ elsif idx == 2 && !docs[idx].nil?
330
+ docs[idx]["job_finished_at_msec"] = docs[idx]["job_finished_at"].strftime("%Q") if !docs[idx]["job_finished_at"].nil?
331
+ end
332
+ if docs[idx].nil?
333
+ parse_data.push({})
334
+ else
335
+ parse_data.push(docs[idx])
336
+ end
337
+ end
338
+ #ensure
339
+ # f.close() if !f.nil?
340
+ #end
341
+ return parse_data
342
+ end
343
+
344
+ def parse_log_dispatcher user
345
+ parse_data = []
346
+ file_path = File.expand_path(["~" + user, @@pmux_log_path, @@dispatcher_log].join(File::SEPARATOR))
347
+ begin
348
+ f = File.open(file_path)
349
+ begin
350
+ f.seek(-@@max_dispatcher_log_size, IO::SEEK_END)
351
+ rescue
352
+ end
353
+ while ln = f.gets
354
+ parse_data.push(ln)
355
+ end
356
+ partial_line = parse_data.shift()
357
+ ensure
358
+ f.close() if !f.nil?
359
+ end
360
+ return parse_data
361
+ end
362
+
363
+ def set_cache_dir_path cache_dir_path
364
+ @cache_dir_path = cache_dir_path
365
+ end
366
+ end
367
+ end
368
+ end
@@ -0,0 +1,129 @@
1
+ require 'singleton'
2
+ require 'logger'
3
+ require 'syslog'
4
+
5
+ module Pmux
6
+ module LogView
7
+ class LoggerWrapper
8
+ include Singleton
9
+
10
+ @@log_level_map = {
11
+ 'debug' => Logger::DEBUG,
12
+ 'info' => Logger::INFO,
13
+ 'warn' => Logger::WARN,
14
+ 'error' => Logger::ERROR,
15
+ 'fatal' => Logger::FATAL
16
+ }
17
+
18
+ @@facility_map = {
19
+ 'user' => Syslog::LOG_USER,
20
+ 'daemon' => Syslog::LOG_DAEMON,
21
+ 'local0' => Syslog::LOG_LOCAL0,
22
+ 'local1' => Syslog::LOG_LOCAL1,
23
+ 'local2' => Syslog::LOG_LOCAL2,
24
+ 'local3' => Syslog::LOG_LOCAL3,
25
+ 'local4' => Syslog::LOG_LOCAL4,
26
+ 'local5' => Syslog::LOG_LOCAL5,
27
+ 'local6' => Syslog::LOG_LOCAL6,
28
+ 'local7' => Syslog::LOG_LOCAL7
29
+ }
30
+
31
+ def init
32
+ @syslog = false
33
+ @logger = nil
34
+ @serverity = Logger::INFO
35
+ @log_dir_path = nil
36
+ end
37
+
38
+ def foreground foreground
39
+ @foreground = foreground
40
+ end
41
+
42
+ def fixup_level level
43
+ return level if @@log_level_map.key?(level)
44
+ return "info"
45
+ end
46
+
47
+ def get_facility facility
48
+ if !facility.nil? && @@facility_map.key?(facility)
49
+ return @@facility_map[facility]
50
+ end
51
+ return Syslog::LOG_USER
52
+ end
53
+
54
+ def open log_file_path, log_level, use_syslog, facility_string
55
+ # ログをオープンする
56
+ # すでに開いている状態で呼ばれるとリオープンする
57
+ @serverity = @@log_level_map[fixup_level(log_level)]
58
+ @log_dir_path = File.dirname(log_file_path)
59
+ FileUtils.mkdir_p(@log_dir_path) if !File.exist?(@log_dir_path)
60
+ old_logger = @logger
61
+ @logger = nil
62
+ begin
63
+ @logger = Logger.new(log_file_path, 'daily')
64
+ @logger.level = @serverity
65
+ old_logger.close() if !old_logger.nil?
66
+ rescue Errno::ENOENT => e
67
+ @logger = old_logger if !old_logger.nil?
68
+ warn("not found log file (#{log_file_path})")
69
+ warn("error: #{e}")
70
+ rescue Errno::EACCES => e
71
+ @logger = old_logger if !old_logger.nil?
72
+ warn("can not access log file (#{log_file_path})")
73
+ warn("error: #{e}")
74
+ end
75
+ if @syslog
76
+ Syslog.close()
77
+ @syslog = false
78
+ end
79
+ if use_syslog
80
+ facility = get_facility(facility_string)
81
+ Syslog.open("pmux-logview", Syslog::LOG_PID, facility)
82
+ @syslog = true
83
+ end
84
+ end
85
+
86
+ def close
87
+ @logger.close() if !@logger.nil?
88
+ @logger = nil
89
+ Syslog.close() if @syslog
90
+ @syslog = false
91
+ end
92
+
93
+ def write msg
94
+ @logger.info(msg.rstrip()) if !@logger.nil?
95
+ Syslog.info("#{msg.rstrip()}") if @syslog
96
+ end
97
+
98
+ def debug msg
99
+ @logger.debug(msg) if !@logger.nil?
100
+ Syslog.debug("#{msg}") if @syslog
101
+ puts "[debug] #{msg}" if @foreground && @@log_level_map["debug"] >= @serverity
102
+ end
103
+
104
+ def info msg
105
+ @logger.info(msg) if !@logger.nil?
106
+ Syslog.info("#{msg}") if @syslog
107
+ puts "[info] #{msg}" if @foreground && @@log_level_map["info"] >= @serverity
108
+ end
109
+
110
+ def warn msg
111
+ @logger.warn(msg) if !@logger.nil?
112
+ Syslog.warning("#{msg}") if @syslog
113
+ puts "[warn] #{msg}" if @foreground && @@log_level_map["warn"] >= @serverity
114
+ end
115
+
116
+ def error msg
117
+ @logger.error(msg) if !@logger.nil?
118
+ Syslog.err("#{msg}") if @syslog
119
+ puts "[error] #{msg}" if @foreground && @@log_level_map["error"] >= @serverity
120
+ end
121
+
122
+ def fatal msg
123
+ @logger.fatal(msg) if !@logger.nil?
124
+ Syslog.crit("#{msg}") if @syslog
125
+ puts "[fatal] #{msg}" if @foreground && @@log_level_map["fatal"] >= @serverity
126
+ end
127
+ end
128
+ end
129
+ end