[Why]
The built-in log system prints logs in string format by default.
The logs should be formatted in json format for subsequent analysis and processing.
[Example1]
use: log.info("test")
output:
{"level":"INFO","level_num":1,"datetime":"2020-11-19 16:57:17+0800","progname":null,"message":"test"}
[Example2]
use: log.error({"job_id" => "1", "job_state" => "submit"}.to_json)
output:
{"level":"ERROR","level_num":3,"datetime":"2020-11-19 16:57:17+0800","progname":null,"message":"",
"job_id":"1","job_state":"submit","caller":["/usr/share/ruby/logger.rb:545:in `error'","./test.rb:6:in`<main>'"]}
Signed-off-by: Wu Zhende <wuzhende666(a)163.com>
---
lib/log.rb | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
create mode 100644 lib/log.rb
diff --git a/lib/log.rb b/lib/log.rb
new file mode 100644
index 0000000..0ffc0f9
--- /dev/null
+++ b/lib/log.rb
@@ -0,0 +1,42 @@
+# SPDX-License-Identifier: MulanPSL-2.0+
+# Copyright (c) 2020 Huawei Technologies Co., Ltd. All rights reserved.
+# frozen_string_literal: true
+
+require 'logger'
+require 'json'
+
+# log class to print logs in JSON format
+class Log < Logger
+ LEVEL_INFO = {
+ 'DEBUG' => 0,
+ 'INFO' => 1,
+ 'WARN' => 2,
+ 'ERROR' => 3,
+ 'FATAL' => 4,
+ 'UNKNOWN' => 5
+ }.freeze
+
+ FORMATTER = proc { |severity, datetime, progname, msg|
+ puts
+ level_num = LEVEL_INFO[severity]
+ begin
+ message = JSON.parse(msg)
+ rescue JSON::ParserError
+ message = { 'message' => msg }
+ end
+ h = {
+ 'level' => severity.to_s,
+ 'level_num' => level_num,
+ 'datetime' => datetime,
+ 'progname' => progname,
+ 'message' => ''
+ }
+ h.merge!(message)
+ h.merge!({ 'caller' => caller }) if level_num >= 2
+ h.to_json
+ }
+
+ def initialize(logdev = STDOUT, formatter = FORMATTER)
+ super(logdev, formatter: formatter)
+ end
+end
--
2.23.0