-
-
Notifications
You must be signed in to change notification settings - Fork 83
Expand file tree
/
Copy pathlog2.lua
More file actions
147 lines (120 loc) · 3.09 KB
/
log2.lua
File metadata and controls
147 lines (120 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
local M = {}
---@alias java-core.LogLevel 'trace'|'debug'|'info'|'warn'|'error'|'fatal'
---@class java-core.Log2Config
---@field use_console boolean Enable console logging
---@field use_file boolean Enable file logging
---@field level java-core.LogLevel Minimum log level to display
---@field log_file string Path to log file
---@field max_lines number Maximum lines to keep in log file
---@field show_location boolean Show file location in log messages
---@class java-core.PartialLog2Config
---@field use_console? boolean Enable console logging
---@field use_file? boolean Enable file logging
---@field level? java-core.LogLevel Minimum log level to display
---@field log_file? string Path to log file
---@field max_lines? number Maximum lines to keep in log file
---@field show_location? boolean Show file location in log messages
---@type java-core.Log2Config
local default_config = {
use_console = false,
use_file = true,
level = 'info',
log_file = vim.fn.stdpath('log') .. '/nvim-java.log',
max_lines = 100,
show_location = false,
}
---@type java-core.Log2Config
local config = vim.deepcopy(default_config)
local log_levels = {
trace = 1,
debug = 2,
info = 3,
warn = 4,
error = 5,
fatal = 6,
}
local highlights = {
trace = 'Comment',
debug = 'Debug',
info = 'DiagnosticInfo',
warn = 'DiagnosticWarn',
error = 'DiagnosticError',
fatal = 'ErrorMsg',
}
---@param user_config? java-core.PartialLog2Config
function M.setup(user_config)
config = vim.tbl_deep_extend('force', config, user_config or {})
end
--- Write message to log file with line limit
---@param msg string
---@private
local function write_to_file(msg)
local log_file = config.log_file
local lines = {}
local file = io.open(log_file, 'r')
if file then
for line in file:lines() do
table.insert(lines, line)
end
file:close()
end
table.insert(lines, msg)
while #lines > config.max_lines do
table.remove(lines, 1)
end
file = io.open(log_file, 'w')
if file then
for _, line in ipairs(lines) do
file:write(line .. '\n')
end
file:close()
end
end
--- Log a message
---@param level java-core.LogLevel
---@param ... any
local function log(level, ...)
if log_levels[level] < log_levels[config.level] then
return
end
local logs = {}
for _, v in ipairs({ ... }) do
table.insert(logs, vim.inspect(v))
end
local location = ''
if config.show_location then
local info = debug.getinfo(3, 'Sl')
if info then
local file = info.short_src or info.source or 'unknown'
local line = info.currentline or 0
location = '[' .. file .. ':' .. line .. ']'
end
end
local msg = level:upper() .. (location ~= '' and '::' .. location or '') .. '::' .. table.concat(logs, '::')
if config.use_console then
local hl = highlights[level] or 'Normal'
vim.api.nvim_echo({ { msg, hl } }, true, {})
end
if config.use_file then
write_to_file(msg)
end
end
function M.info(...)
log('info', ...)
end
function M.debug(...)
log('debug', ...)
end
function M.fatal(...)
log('fatal', ...)
end
function M.error(...)
log('error', ...)
end
function M.trace(...)
log('trace', ...)
end
function M.warn(...)
log('warn', ...)
end
return M