forked from joey/godottest
107 lines
4.1 KiB
GDScript
107 lines
4.1 KiB
GDScript
extends Node
|
|
|
|
const LEVEL_NOTSET: int = 0
|
|
const LEVEL_DEBUG: int = 10
|
|
const LEVEL_INFO: int = 20
|
|
const LEVEL_WARNING: int = 30
|
|
const LEVEL_ERROR: int = 40
|
|
const LEVEL_CRITICAL: int = 50
|
|
|
|
static func level_to_str(level: int) -> String:
|
|
return GLogger.level_to_str(level)
|
|
|
|
## Logger class with a fixed name and log level.
|
|
## Use level LEVEL_NOTSET to use log level of parent.
|
|
class GLogger:
|
|
extends RefCounted
|
|
|
|
var name: String = "root"
|
|
var _log_level: int = LEVEL_NOTSET
|
|
var parent: GLogger = null
|
|
|
|
func _init(module_name: String, log_level: int = LEVEL_NOTSET, parent: GLogger = null) -> void:
|
|
self.name = module_name
|
|
self.set_log_level(log_level)
|
|
self.parent = parent
|
|
|
|
func set_log_level(level: int) -> void:
|
|
self._log_level = level
|
|
|
|
func log_level() -> int:
|
|
if self.parent != null && self._log_level == LEVEL_NOTSET:
|
|
return self.parent.log_level()
|
|
return self._log_level
|
|
|
|
func create_child(module_name: String, log_level: int = LEVEL_NOTSET) -> GLogger:
|
|
return GLogger.new(module_name, log_level, self)
|
|
|
|
func debug(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.log(LEVEL_DEBUG, message, values)
|
|
|
|
func info(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.log(LEVEL_INFO, message, values)
|
|
|
|
func warning(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.log(LEVEL_WARNING, message, values)
|
|
|
|
func error(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.log(LEVEL_ERROR, message, values)
|
|
|
|
func critical(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.log(LEVEL_CRITICAL, message, values)
|
|
|
|
func log(level: int, message: Variant, values: Array[Variant] = []) -> void:
|
|
if self.log_level() <= level:
|
|
self._log(level, self.name, message, values)
|
|
|
|
static func level_to_str(level: int) -> String:
|
|
if level <= 0:
|
|
return "NOTSET"
|
|
if level <= 10:
|
|
return "DEBUG"
|
|
if level <= 20:
|
|
return "INFO"
|
|
if level <= 30:
|
|
return "WARNING"
|
|
if level <= 40:
|
|
return "ERROR"
|
|
return "CRITICAL"
|
|
|
|
func _log(level: int, module: String, message: Variant, values: Array[Variant] = []) -> void:
|
|
var unix_time: float = Time.get_unix_time_from_system()
|
|
var time: Dictionary = Time.get_datetime_dict_from_unix_time(unix_time)
|
|
time.merge(Time.get_time_dict_from_unix_time(unix_time))
|
|
time["millisecond"] = int(str(unix_time).pad_decimals(3).split(".", true, 1)[1])
|
|
var msg: String
|
|
if values.is_empty():
|
|
msg = "%04d-%02d-%02d %02d:%02d:%02d.%03d [%8s] [%10s] %s" % [time["year"], time["month"], time["day"], time["hour"], time["minute"], time["second"], time["millisecond"], level_to_str(level), module, message]
|
|
else:
|
|
msg = "%04d-%02d-%02d %02d:%02d:%02d.%03d [%8s] [%10s] %s" % [time["year"], time["month"], time["day"], time["hour"], time["minute"], time["second"], time["millisecond"], level_to_str(level), module, message % values]
|
|
print(msg)
|
|
match level:
|
|
LEVEL_CRITICAL, LEVEL_ERROR:
|
|
push_error(msg)
|
|
LEVEL_WARNING:
|
|
push_warning(msg)
|
|
|
|
var root_logger: GLogger = GLogger.new("root", LEVEL_DEBUG)
|
|
|
|
func debug(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.root_logger.log(LEVEL_DEBUG, message, values)
|
|
|
|
func info(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.root_logger.log(LEVEL_INFO, message, values)
|
|
|
|
func warning(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.root_logger.log(LEVEL_WARNING, message, values)
|
|
|
|
func error(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.root_logger.log(LEVEL_ERROR, message, values)
|
|
|
|
func critical(message: Variant, values: Array[Variant] = []) -> void:
|
|
self.root_logger.log(LEVEL_CRITICAL, message, values)
|
|
|
|
func log(level: int, module: String, message: Variant, values: Array[Variant] = []) -> void:
|
|
if self.root_logger.log_level() <= level:
|
|
self.root_logger._log(level, module, message, values)
|