From 87dd78bf46c4ff0d02f851acd927e3d3f521392c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Fri, 12 Oct 2018 16:57:00 +0800 Subject: =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/log.lua | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/log.lua (limited to 'src') diff --git a/src/log.lua b/src/log.lua new file mode 100644 index 00000000..13e3ce7c --- /dev/null +++ b/src/log.lua @@ -0,0 +1,89 @@ +require 'filesystem' + +local log = {} + +log.file = nil +log.start_time = os.time() - os.clock() +log.size = 0 +log.max_size = 100 * 1024 * 1024 + +local function trim_src(src) + src = src:sub(log.prefix_len, -5) + src = src:gsub('[\\/]+', '.') + return src +end + +local function push_log(level, ...) + if not log.path then + return + end + if log.size > log.max_size then + return + end + local t = table.pack(...) + for i = 1, t.n do + t[i] = tostring(t[i]) + end + local str = table.concat(t, '\t') + if level == 'error' then + str = str .. '\n' .. debug.traceback(nil, 3) + end + if not log.file then + log.file = io.open(log.path, 'w') + if not log.file then + return + end + log.file:write('') + log.file:close() + log.file = io.open(log.path, 'ab') + if not log.file then + return + end + log.file:setvbuf 'no' + end + local sec, ms = math.modf(log.start_time + os.clock()) + local timestr = os.date('%Y-%m-%d %H:%M:%S', sec) + local info = debug.getinfo(3, 'Sl') + local buf + if info and info.currentline > 0 then + buf = ('[%s.%03.f][%s]: [%s:%s]%s\n'):format(timestr, ms * 1000, level, trim_src(info.source), info.currentline, str) + else + buf = ('[%s.%03.f][%s]: %s\n'):format(timestr, ms * 1000, level, str) + end + log.file:write(buf) + log.size = log.size + #buf + if log.size > log.max_size then + log.file:write('[日志过大]') + end + return str +end + +function log.info(...) + push_log('info', ...) +end + +function log.debug(...) + push_log('debug', ...) +end + +function log.trace(...) + push_log('trace', ...) +end + +function log.warn(...) + push_log('warn', ...) +end + +function log.error(...) + push_log('error', ...) +end + +function log.init(root, path) + log.path = path:string() + log.prefix_len = #root:string() + 3 + if not fs.exists(path:parent_path()) then + fs.create_directories(path:parent_path()) + end +end + +return log -- cgit v1.2.3