diff options
| author | RblSb <msrblsb@gmail.com> | 2020-06-03 14:32:02 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2020-06-03 14:32:02 +0300 |
| commit | 6bb620cb803a6587dcbacc4a3360cbf3d75f3064 (patch) | |
| tree | 93424d764d9922ab74617eb4793b5cc0ed6eec0d /src/server/Logger.hx | |
| parent | c1a044cf6c83dd87c81ad90ab0a4d10d2f74f67c (diff) | |
Event logs and log replay
Diffstat (limited to 'src/server/Logger.hx')
| -rw-r--r-- | src/server/Logger.hx | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/server/Logger.hx b/src/server/Logger.hx new file mode 100644 index 0000000..9ff4c34 --- /dev/null +++ b/src/server/Logger.hx @@ -0,0 +1,69 @@ +package server; + +import haxe.io.Path; +import sys.io.File; +import haxe.Json; +import sys.FileSystem; +using StringTools; +using Lambda; + +class Logger { + + final folder:String; + final maxCount:Int; + final verbose:Bool; + final logs:Array<ServerEvent> = []; + final matchFileFormat = ~/[0-9_-]+\.json$/; + + public function new(folder:String, maxCount:Int, verbose:Bool):Void { + this.folder = folder; + this.maxCount = maxCount; + this.verbose = verbose; + } + + public function log(event:ServerEvent):Void { + logs.push(event); + if (logs.length > 5000) logs.shift(); + } + + public function saveLog():Void { + if (logs.length == 0) return; + Utils.ensureDir(folder); + removeOldestLog(folder); + final name = DateTools.format(Date.now(), "%Y-%m-%d_%H_%M_%S"); + File.saveContent('$folder/$name.json', Json.stringify(logs, filterNulls, "\t")); + } + + function filterNulls(key:Any, value:Any):Any { + #if js + if (value == null) return js.Lib.undefined; + #end + return value; + } + + function removeOldestLog(folder:String):Void { + final names = FileSystem.readDirectory(folder); + if (names.count(item -> matchFileFormat.match(item)) < maxCount) return; + var minDate = 0.0; + var fileName:String = null; + for (name in names) { + final date = extractFileDate(name).getTime(); + if (minDate == 0 || minDate > date) { + minDate = date; + fileName = name; + } + } + if (fileName == null) return; + FileSystem.deleteFile('$folder/$fileName'); + } + + function extractFileDate(name:String):Date { + name = Path.withoutExtension(name); + final t = name.split("_"); + final d = t.shift().split("-"); + if (d.length != 3 && t.length != 3) return Date.fromTime(0); + final s = '${d[0]}-${d[1]}-${d[2]} ${t[0]}:${t[1]}:${t[2]}'; + return Date.fromString(s); + } + +} |
