1
0
forked from joey/godottest
Joey Eamigh 9989fab018
addons?
2025-10-10 14:07:23 -04:00

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)