- added Logger

This commit is contained in:
incredibleLeitman 2019-11-02 20:06:20 +01:00
parent 341c8ba2f2
commit 932930b6b7
10 changed files with 584 additions and 2 deletions

View File

@ -7,6 +7,7 @@ var _visibility: Area
func _ready():
Logger.set_logger_level(Logger.LOG_LEVEL_DEBUG)
_visibility = get_node(_visibility_path) as Area
if _visibility:
@ -17,6 +18,7 @@ func _ready():
func _on_body_entered_visibility(body: Node):
if body.is_in_group("Player"):
print("Seeing player!")
Logger.info("Seeing player!")
# TODO: Check if the Player is in an area where they shouldn't be
# TODO: Follow the Player
@ -25,4 +27,5 @@ func _on_body_entered_visibility(body: Node):
func _on_body_exited_visibility(body: Node):
if body.is_in_group("Player"):
print("Stopped seeing player!")
Logger.info("Stopped seeing player!")
# TODO: Stop following the Player

View File

@ -0,0 +1,52 @@
"""
Class: Appender
Responsible for Delivering a Log Event to its Destination.
"""
extends Reference
class_name Appender
var layout: Layout = PatternLayout.new()
var logger_level: int = 999 setget _set_logger_level
var logger_format: int = 030
var name = "appender"
var is_open = false
func _set_logger_level(level: int):
logger_level = level
"""
Function: start
Start this Appender
"""
func start():
pass
"""
Function: stop
Stop this Appender
"""
func stop():
pass
"""
Function: append
Logs an Event in whatever logic this Appender has
"""
func append(message: Message):
pass
"""
Function: append_raw
Send Raw Text to the Appender
"""
func append_raw(text: String):
pass
func _init():
pass

View File

@ -0,0 +1,21 @@
"""
Class: ConsoleAppender
Logs an Event to the Console Window.
"""
extends Appender
class_name ConsoleAppender
func append(message: Message):
print(layout.build(message, logger_format))
func append_raw(text: String):
print(text)
func _init():
name = "console appender"
print("** Console Appender Initialized **")
print(" ")

View File

@ -0,0 +1,32 @@
"""
Class: FileAppender
Logs an Event to a File.
"""
extends Appender
class_name FileAppender
var savefile
func append(message):
savefile.store_string(layout.build(message, logger_format))
savefile.store_string("\n")
func append_raw(text):
savefile.store_string(text)
savefile.store_string("\n")
func stop():
savefile.close()
func _init(filename="%s.log" % ProjectSettings.get("application/config/name")):
savefile = File.new()
savefile.open("%s" % [filename], File.WRITE)
name = "file appender"
print("** File Appender Initialized **")
print(" ")

View File

@ -0,0 +1,21 @@
"""
Class: Layout
Formats a Log Event for an Appender.
"""
extends Reference
class_name Layout
func getHeader():
return ""
func getFooter():
return ""
func build(message: Message, format: int):
return message
func _init():
pass

View File

@ -0,0 +1,61 @@
"""
Class: HtmlLayout
Generates an HTML Page and adds each Log Event
to a Row in a Table.
"""
extends Layout
class_name HtmlLayout
var contextual_classes = \
{
Logger.LOG_LEVEL_ALL: "",
Logger.LOG_LEVEL_FINE: "",
Logger.LOG_LEVEL_TRACE: "",
Logger.LOG_LEVEL_INFO: "info",
Logger.LOG_LEVEL_FATAL: "danger",
Logger.LOG_LEVEL_WARN: "warning",
Logger.LOG_LEVEL_ERROR: "danger",
Logger.LOG_LEVEL_DEBUG: "",
Logger.LOG_LEVEL_NONE: "",
}
var header = \
"""
<html>
<head>
<title>Message Log</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<h2>Godot Logger</h2>
<table class="table table-condensed table-hover">
<thead>
<th>Number</th>
<th>Message</th>
</thead>
"""
var footer = \
"""
</table>
</body>
</html>
"""
func getHeader():
return header
func getFooter():
return "</body>"
func build(message: Message, format: int):
return '<tr class="%s"><td style="width:100px"><span class="glyphicon glyphicon-edit" style="padding-right:10px"></span><span>%d</span></td><td>%s</td></tr>' % [contextual_classes[message.level], message.line, message.text]

View File

@ -0,0 +1,44 @@
"""
Class: PatternLayout
A Flexible Layout with a Pattern String.
"""
extends Layout
class_name PatternLayout
func build(message: Message, format: int):
match format:
Logger.LOG_FORMAT_DEFAULT:
return "%-10s %-8d %s" % [Logger.get_level_name(message.level), message.line, message.text]
Logger.LOG_FORMAT_FULL:
return "%s %-8s %-8s %-8d %s" % [Logger.get_formatted_date(OS.get_datetime()), message.category.to_upper(), Logger.get_level_name(message.level), message.line, message.text]
Logger.LOG_FORMAT_MORE:
return "%s %-8s %-8d %s" % [Logger.get_formatted_date(OS.get_datetime()), Logger.get_level_name(message.level), message.line, message.text]
Logger.LOG_FORMAT_NONE:
return message.text
Logger.LOG_FORMAT_SIMPLE:
return "%-8d %s" % [message.line, message.text]
_:
return "%-8s %s" % [Logger.get_formatted_date(OS.get_datetime()), message.text]
"""
var msg = ""
match format:
LogFormats.FULL:
msg = "%s %-8s %-8s %-8d %s" % [_get_formatted_date(OS.get_datetime()), category.to_upper(), _get_level_name(level), logger_line, message]
LogFormats.MORE:
msg = "%-8s %-8s %-8d %s" % [_get_formatted_date(OS.get_datetime()), category.to_upper(), _get_level_name(level), logger_line, message]
LogFormats.DEFAULT:
msg = "%-10s %-8d %s" % [_get_level_name(level), logger_line, message]
LogFormats.SIMPLE:
msg = "%-8d %s" % [logger_line, message]
_:
msg = "%s" % [message]
"""

View File

@ -0,0 +1,277 @@
"""
Class: Logger
A general purpose Logger for use with GDScript.
Copyright:
Copyright 2018 SpockerDotNet LLC
Remarks:
The Logger will send a request to an
Appender to output a log message.
See Also:
Appender, Layout, Message
"""
extends Node
const CATEGORY_GENERAL = "general"
const CATEGORY_WARN = "warn"
const CATEGORY_ERROR = "error"
const CATEGORY_SYSTEM = "system"
const CATEGORY_INPUT = "input"
const CATEGORY_GUI = "gui"
const CATEGORY_SIGNAL = "signal"
const CATEGORY_BEHAVIOR = "behavior"
const CATEGORY_FSM = "fsm"
const CATEGORY_NETWORK = "network"
const CATEGORY_PHYSICS = "physics"
const CATEGORY_GAME = "game"
const CATEGORY_AUDIO = "audio"
const CATEGORY_CAMERA = "camera"
const LOG_LEVEL_ALL = 999
const LOG_LEVEL_FINE = 700
const LOG_LEVEL_TRACE = 600
const LOG_LEVEL_DEBUG = 500
const LOG_LEVEL_INFO = 400
const LOG_LEVEL_WARN = 200
const LOG_LEVEL_ERROR = 100
const LOG_LEVEL_FATAL = 001
const LOG_LEVEL_NONE = 000
const LOG_FORMAT_SIMPLE = 20
const LOG_FORMAT_DEFAULT = 30
const LOG_FORMAT_MORE = 90
const LOG_FORMAT_FULL = 99
const LOG_FORMAT_NONE = -1
var logger_level = LOG_LEVEL_ALL setget set_logger_level
var logger_line = 0
var logger_appenders = []
var refresh_appenders = false
var version = "3.1-R3"
# PUBLIC
func add_appender(appender):
if appender is Appender:
logger_appenders.append(appender)
refresh_appenders = true
return appender
func set_logger_level(level):
logger_level = level
print("Logging Level is %s" % [_get_level_name(logger_level)])
print(" ")
for appender in logger_appenders:
appender.logger_level = level
func set_logger_format(format):
for appender in logger_appenders:
appender.logger_format = format
static func get_level_name(level):
match level:
LOG_LEVEL_ALL:
return "ALL"
LOG_LEVEL_FINE:
return "FINE"
LOG_LEVEL_TRACE:
return "TRACE"
LOG_LEVEL_DEBUG:
return "DEBUG"
LOG_LEVEL_INFO:
return "INFO"
LOG_LEVEL_WARN:
return "WARN"
LOG_LEVEL_ERROR:
return "ERROR"
LOG_LEVEL_FATAL:
return "FATAL"
_:
return "NONE"
"""
Function: log
Log a Message at the Info level.
Remarks:
This is the Default level of logging.
"""
func info(message, category=CATEGORY_GENERAL):
_append(LOG_LEVEL_INFO, message, category)
"""
Function: fine
Log a Message at a Fine level.
"""
func fine(message, category=CATEGORY_GENERAL):
_append(LOG_LEVEL_FINE, message, category)
"""
Function: trace
Log a Message at a Trace level.
"""
func trace(message, category=CATEGORY_GENERAL):
_append(LOG_LEVEL_TRACE, message, category)
"""
Function: debug
Log a Message at a Trace level.
"""
func debug(message, category=CATEGORY_GENERAL):
_append(LOG_LEVEL_DEBUG, message, category)
"""
Function: warn
Log a Warning Message.
"""
func warn(message, category=CATEGORY_GENERAL):
_append(LOG_LEVEL_WARN, message, category)
"""
Function: error
Log an Error Message.
"""
func error(message, category=CATEGORY_GENERAL):
_append(LOG_LEVEL_ERROR, message, category)
"""
Function: fatal
Log an Error Message.
"""
func fatal(message, category=CATEGORY_GENERAL):
_append(LOG_LEVEL_FATAL, message, category)
"""
Function: get_formatted_date
Returns a Date in a Formatted form for an Event.
"""
func get_formatted_date(date):
return _get_formatted_date(date)
# PRIVATE
func _get_formatted_date(date):
return "%02d/%02d/%02d %02d:%02d:%02d" % [date.month, date.day, date.year, date.hour, date.minute, date.second]
func _get_format_name(format):
match format:
LOG_FORMAT_FULL:
return "FULL"
LOG_FORMAT_MORE:
return "MORE"
LOG_FORMAT_DEFAULT:
return "DEFAULT"
LOG_FORMAT_SIMPLE:
return "SIMPLE"
_:
return "NONE"
func _get_level_name(level):
match level:
LOG_LEVEL_ALL:
return "ALL"
LOG_LEVEL_TRACE:
return "FINE"
LOG_LEVEL_FINE:
return "TRACE"
LOG_LEVEL_DEBUG:
return "DEBUG"
LOG_LEVEL_INFO:
return "INFO"
LOG_LEVEL_WARN:
return "WARN"
LOG_LEVEL_ERROR:
return "ERROR"
LOG_LEVEL_FATAL:
return "FATAL"
_:
return "NONE"
func _get_format_by_name(format_name):
match format_name.to_lower():
"full":
return LOG_FORMAT_FULL
"more":
return LOG_FORMAT_MORE
"default":
return LOG_FORMAT_DEFAULT
"simple":
return LOG_FORMAT_SIMPLE
_:
return LOG_FORMAT_NONE
func _get_logger_level_by_name(logger_level_name):
match logger_level_name.to_lower():
"all": return LOG_LEVEL_ALL
"fine": return LOG_LEVEL_FINE
"trace": return LOG_LEVEL_TRACE
"debug": return LOG_LEVEL_DEBUG
"info": return LOG_LEVEL_INFO
"warn": return LOG_LEVEL_WARN
"error": return LOG_LEVEL_ERROR
"fatal": return LOG_LEVEL_FATAL
"none": return LOG_LEVEL_NONE
func _append(level, message = "", category = CATEGORY_GENERAL):
if logger_appenders.size() <= 0:
var ca = ConsoleAppender.new()
ca.logger_level = logger_level
logger_appenders.append(ca)
if refresh_appenders:
refresh_appenders = false
for appender in logger_appenders:
appender.start()
appender.append_raw(appender.layout.getHeader())
logger_line += 1
for appender in logger_appenders:
if level <= appender.logger_level:
appender.append(Message.new(level, message, category, logger_line))
func _exit_tree():
for appender in logger_appenders:
appender.append_raw(appender.layout.getFooter())
appender.stop()
logger_appenders.clear()
func _init():
print(" ")
print("godot-stuff Logger")
print("https://gitlab.com/godot-stuff/gs-logger")
print("Copyright 2018-2019, SpockerDotNet LLC")
print("Version " + version)
print(" ")
if ProjectSettings.has_setting("logger/level"):
set_logger_level(_get_logger_level_by_name(ProjectSettings.get_setting("logger/level")))

View File

@ -0,0 +1,26 @@
"""
Class: Message
Simple representation of a Message to Append to a Logger
Remarks:
A Layout will Format a message before it is sent to
its assigned Appender.
"""
extends Reference
class_name Message
var level: int
var text: String
var category: String
var line: int
var data
func _init(level=000, text="", category="general", line=0, data={}):
self.level = level
self.text = text
self.category = category
self.line = line
self.data = data

View File

@ -8,9 +8,50 @@
config_version=4
_global_script_classes=[ ]
_global_script_classes=[ {
"base": "Reference",
"class": "Appender",
"language": "GDScript",
"path": "res://Util/gs-logger-3.1-R3/gs_logger/appender.gd"
}, {
"base": "Appender",
"class": "ConsoleAppender",
"language": "GDScript",
"path": "res://Util/gs-logger-3.1-R3/gs_logger/appenders/console_appender.gd"
}, {
"base": "Appender",
"class": "FileAppender",
"language": "GDScript",
"path": "res://Util/gs-logger-3.1-R3/gs_logger/appenders/file_appender.gd"
}, {
"base": "Layout",
"class": "HtmlLayout",
"language": "GDScript",
"path": "res://Util/gs-logger-3.1-R3/gs_logger/layouts/html_layout.gd"
}, {
"base": "Reference",
"class": "Layout",
"language": "GDScript",
"path": "res://Util/gs-logger-3.1-R3/gs_logger/layout.gd"
}, {
"base": "Reference",
"class": "Message",
"language": "GDScript",
"path": "res://Util/gs-logger-3.1-R3/gs_logger/message.gd"
}, {
"base": "Layout",
"class": "PatternLayout",
"language": "GDScript",
"path": "res://Util/gs-logger-3.1-R3/gs_logger/layouts/pattern_layout.gd"
} ]
_global_script_class_icons={
"Appender": "",
"ConsoleAppender": "",
"FileAppender": "",
"HtmlLayout": "",
"Layout": "",
"Message": "",
"PatternLayout": ""
}
[application]
@ -19,6 +60,10 @@ config/name="retrace"
run/main_scene="res://Level/PathTestWorld.tscn"
config/icon="res://icon.png"
[autoload]
Logger="*res://Util/gs-logger-3.1-R3/gs_logger/logger.gd"
[input]
move_left={