package kernel.log; import haxe.ds.ReadOnlyArray; #if webconsole import lib.Debug; #end using tink.CoreApi; /** Central logging system. **/ class Log { public static var instance:Log; private static inline final MAX_LINES:Int = 100; public final onLog:Signal; private final onLogTrigger:SignalTrigger = new SignalTrigger(); private final logLines:Array = []; public function new() { onLog = onLogTrigger.asSignal(); } public static function info(msg:Dynamic, ?pos:haxe.PosInfos) { instance.log({level: Info, message: Std.string(msg),time: 0},pos); } public static function warn(msg:Dynamic, ?pos:haxe.PosInfos) { instance.log({level: Warn, message: Std.string(msg),time: 0},pos); } public static function error(msg:Dynamic, ?pos:haxe.PosInfos) { instance.log({level: Error, message: Std.string(msg),time: 0},pos); } public static function debug(msg:Dynamic, ?pos:haxe.PosInfos) { #if debug instance.log({level: Debug, message: Std.string(msg),time: 0},pos); #end } public static function silly(msg:Dynamic, ?pos:haxe.PosInfos) { instance.log({level: Silly, message: Std.string(msg),time: 0},pos); } private function log(line: LogLine, ?pos:haxe.PosInfos) { line.origin = pos.className; logLines.push(line); if (logLines.length > MAX_LINES) { logLines.shift(); } #if webconsole Debug.printWeb('[${Std.string(line.level)}][${line.origin}] ${line.message}'); #end onLogTrigger.trigger(line); } public function getLines():ReadOnlyArray { return logLines; } }