1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-01-23 22:30:04 +08:00
SpaceVim/lua/spacevim/api/logger.lua
2023-09-16 15:21:40 +08:00

154 lines
3.2 KiB
Lua

--=============================================================================
-- logger.lua --- logger api implemented in lua
-- Copyright (c) 2016-2023 Wang Shidong & Contributors
-- Author: Wang Shidong < wsdjeg@outlook.com >
-- URL: https://spacevim.org
-- License: GPLv3
--=============================================================================
local fn = vim.fn or require('spacevim').fn
local nt = require('spacevim.api.notify')
local rtplog = {}
local M = {
name = '',
silent = 1,
level = 1,
verbose = 1,
file = '',
temp = {},
}
M.levels = { 'Info ', 'Warn ', 'Error', 'Debug' }
M.clock = fn.reltime()
function M.set_silent(sl)
if type(sl) == 'boolean' then
M.silent = sl
elseif type(sl) == 'number' then
-- this is for backward compatibility.
if sl == 1 then
M.silent = true
elseif sl == 0 then
M.silent = false
end
end
end
function M.set_verbose(vb)
-- verbose should be 1 - 4
-- message type: log debug, info, warn, error
-- info and debug should not be print to screen.
-- the default verbose is 1
-- 1: notify nothing
-- 2: notify only error
-- 3: notify warn and error
M.verbose = vb
end
function M.set_level(l)
-- the level only can be:
-- 0 : log debug, info, warn, error messages
-- 1 : log info, warn, error messages
-- 2 : log warn, error messages
-- 3 : log error messages
if l == 0 or l == 1 or l == 2 or l == 3 then
M.level = l
end
end
function M._build_msg(msg, l)
msg = msg or ''
local _, mic = vim.loop.gettimeofday()
local c = string.format('%s:%03d', os.date('%H:%M:%S'), mic / 1000)
-- local log = string.format('[ %s ] [%s] [ %s ] %s', M.name, c, M.levels[l], msg)
return {
name = M.name,
time = c,
msg = msg,
level = l,
str = string.format('[ %s ] [%s] [ %s ] %s', M.name, c, M.levels[l], msg),
}
end
function M.write(log)
table.insert(M.temp, log)
table.insert(rtplog, log.str)
end
function M.debug(msg)
if M.level <= 0 then
local log = M._build_msg(msg, 4)
M.write(log)
end
end
function M.error(msg)
local log = M._build_msg(msg, 3)
if M.silent == 0 and M.verbose >= 1 then
nt.notify(msg, 'Error')
end
M.write(log)
end
function M.warn(msg, ...)
if M.level <= 2 then
local log = M._build_msg(msg, 2)
local issilent = select(1, ...)
if type(issilent) == 'number' then
if issilent == 1 then
issilent = true
else
issilent = false
end
elseif type(issilent) ~= 'boolean' then
issilent = false
end
if not issilent then
nt.notify(msg, 'WarningMsg')
else
if not M.silent and M.verbose >= 2 then
nt.notify(msg, 'WarningMsg')
end
end
M.write(log)
end
end
function M.info(msg)
if M.level <= 1 then
local log = M._build_msg(msg, 1)
M.write(log)
end
end
function M.view_all()
local info = table.concat(rtplog, '\n')
return info
end
function M.view(l)
local info = ''
for _, log in ipairs(M.temp) do
if log.level >= l then
info = info .. log.str .. '\n'
end
end
return info
end
function M.set_name(name)
if type(name) == 'string' then
M.name = name
end
end
function M.get_name()
return M.name
end
return M