diff options
author | kylo252 <[email protected]> | 2021-10-21 07:42:28 +0200 |
---|---|---|
committer | GitHub <[email protected]> | 2021-10-21 07:42:28 +0200 |
commit | 25747cfff457d5375b6141588d81017ca515ffcb (patch) | |
tree | de3600a58335600fc1a77233f01b300adc0ffacb /lua/lvim/core/log.lua | |
parent | 03e5760e59b5dd420956908b6f8b57c33f70f2cd (diff) |
[Feature] use structlog and notify.nvim (#1737)
Co-authored-by: Luc Sinet <[email protected]>
Diffstat (limited to 'lua/lvim/core/log.lua')
-rw-r--r-- | lua/lvim/core/log.lua | 147 |
1 files changed, 124 insertions, 23 deletions
diff --git a/lua/lvim/core/log.lua b/lua/lvim/core/log.lua index 3d8c0dc8..9ddc641f 100644 --- a/lua/lvim/core/log.lua +++ b/lua/lvim/core/log.lua @@ -1,60 +1,161 @@ local Log = {} +local logfile = string.format("%s/%s.log", vim.fn.stdpath "cache", "lvim") + +Log.levels = { + TRACE = 1, + DEBUG = 2, + INFO = 3, + WARN = 4, + ERROR = 5, +} + +vim.tbl_add_reverse_lookup(Log.levels) + +function Log:init() + local status_ok, structlog = pcall(require, "structlog") + if not status_ok then + return nil + end + + local nvim_notify_params = {} + local nvim_notify_params_injecter = function(_, entry) + for key, value in pairs(nvim_notify_params) do + entry[key] = value + end + return entry + end + + local nvim_notify_default_namer = function(logger, entry) + entry["title"] = logger.name + return entry + end + + nvim_notify_params_injecter(nil, {}) + local log_level = Log.levels[(lvim.log.level):upper() or "WARN"] + structlog.configure { + lvim = { + sinks = { + structlog.sinks.Console(log_level, { + async = false, + processors = { + structlog.processors.Namer(), + structlog.processors.StackWriter({ "line", "file" }, { max_parents = 0, stack_level = 2 }), + structlog.processors.Timestamper "%H:%M:%S", + }, + formatter = structlog.formatters.FormatColorizer( -- + "%s [%-5s] %s: %-30s", + { "timestamp", "level", "logger_name", "msg" }, + { level = structlog.formatters.FormatColorizer.color_level() } + ), + }), + structlog.sinks.NvimNotify(Log.levels.INFO, { + processors = { + nvim_notify_default_namer, + nvim_notify_params_injecter, + }, + formatter = structlog.formatters.Format( -- + "%s", + { "msg" }, + { blacklist_all = true } + ), + params_map = { + icon = "icon", + keep = "keep", + on_open = "on_open", + on_close = "on_close", + timeout = "timeout", + title = "title", + }, + }), + structlog.sinks.File(Log.levels.TRACE, logfile, { + processors = { + structlog.processors.Namer(), + structlog.processors.StackWriter({ "line", "file" }, { max_parents = 3, stack_level = 2 }), + structlog.processors.Timestamper "%H:%M:%S", + }, + formatter = structlog.formatters.Format( -- + "%s [%-5s] %s: %-30s", + { "timestamp", "level", "logger_name", "msg" } + ), + }), + }, + }, + } + + local logger = structlog.get_logger "lvim" + + if lvim.log.override_notify then + -- Overwrite vim.notify to use the logger + vim.notify = function(msg, vim_log_level, opts) + nvim_notify_params = opts or {} + -- https://github.com/neovim/neovim/blob/685cf398130c61c158401b992a1893c2405cd7d2/runtime/lua/vim/lsp/log.lua#L5 + logger:log(vim_log_level + 1, msg) + end + end + + return logger +end + --- Adds a log entry using Plenary.log ----@param msg any +---@fparam msg any ---@param level string [same as vim.log.log_levels] -function Log:add_entry(msg, level) - assert(type(level) == "string") +function Log:add_entry(level, msg, event) if self.__handle then - -- plenary uses lower-case log levels - self.__handle[level:lower()](msg) + self.__handle:log(level, msg, event) return end - local status_ok, plenary = pcall(require, "plenary") - if status_ok then - local default_opts = { plugin = "lunarvim", level = lvim.log.level, info_level = 4 } - local handle = plenary.log.new(default_opts) - handle[level:lower()](msg) - self.__handle = handle + + local logger = self:init() + if not logger then + return end - -- don't do anything if plenary is not available + + self.__handle = logger + self.__handle:log(level, msg, event) end ---Retrieves the path of the logfile ---@return string path of the logfile function Log:get_path() - return string.format("%s/%s.log", vim.fn.stdpath "cache", "lunarvim") + return logfile end ---Add a log entry at TRACE level ---@param msg any -function Log:trace(msg) - self:add_entry(msg, "TRACE") +---@param event any +function Log:trace(msg, event) + self:add_entry(self.levels.TRACE, msg, event) end ---Add a log entry at DEBUG level ---@param msg any -function Log:debug(msg) - self:add_entry(msg, "DEBUG") +---@param event any +function Log:debug(msg, event) + self:add_entry(self.levels.DEBUG, msg, event) end ---Add a log entry at INFO level ---@param msg any -function Log:info(msg) - self:add_entry(msg, "INFO") +---@param event any +function Log:info(msg, event) + self:add_entry(self.levels.INFO, msg, event) end ---Add a log entry at WARN level ---@param msg any -function Log:warn(msg) - self:add_entry(msg, "WARN") +---@param event any +function Log:warn(msg, event) + self:add_entry(self.levels.WARN, msg, event) end ---Add a log entry at ERROR level ---@param msg any -function Log:error(msg) - self:add_entry(msg, "ERROR") +---@param event any +function Log:error(msg, event) + self:add_entry(self.levels.ERROR, msg, event) end setmetatable({}, Log) + return Log |