Skip to content

Commit 73d09db

Browse files
authored
fix: do not capture LSP logs by default and ensure only Copilot logs are captured (#394)
Fixes #391
1 parent de1308f commit 73d09db

File tree

4 files changed

+81
-59
lines changed

4 files changed

+81
-59
lines changed

README.md

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ require('copilot').setup({
9595
print_log_level = vim.log.levels.WARN,
9696
trace_lsp = "off", -- "off" | "messages" | "verbose"
9797
trace_lsp_progress = false,
98+
log_lsp_messages = false,
9899
},
99100
copilot_node_command = 'node', -- Node.js version must be > 18.x
100101
workspace_folders = {},
@@ -194,8 +195,8 @@ require("copilot").setup {
194195

195196
### logger
196197

197-
When `log_to_file` is true, logs will be written to the `file` for anything of `file_log_level` or higher.
198-
When `print_log` is true, logs will be printed to NeoVim (using `notify`) for anything of `print_log_level` or higher.
198+
Logs will be written to the `file` for anything of `file_log_level` or higher.
199+
Logs will be printed to NeoVim (using `notify`) for anything of `print_log_level` or higher.
199200
File logging is done asynchronously to minimize performance impacts, however there is still some overhead.
200201

201202
Log levels used are the ones defined in `vim.log`:
@@ -213,8 +214,14 @@ vim.log = {
213214
}
214215
```
215216

216-
`trace_lsp` can either be `off`, `messages` which will output the LSP messages, or `verbose` which adds additonal information to the message.
217-
When `trace_lsp_progress` is true, LSP progress messages will also be logged.
217+
`trace_lsp` controls logging of LSP trace messages (`$/logTrace`) can either be:
218+
219+
- `off`
220+
- `messages` which will output the LSP messages
221+
- `verbose` which adds additonal information to the message.
222+
223+
When `trace_lsp_progress` is true, LSP progress messages (`$/progress`) will also be logged.
224+
When `log_lsp_messages` is true, LSP log messages (`window/logMessage`) events will be logged.
218225

219226
Careful turning on all logging features as the log files may get very large over time, and are not pruned by the application.
220227

lua/copilot/client.lua

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,37 @@ function M.use_client(callback)
189189
)
190190
end
191191

192+
local function get_handlers()
193+
local handlers = {
194+
PanelSolution = api.handlers.PanelSolution,
195+
PanelSolutionsDone = api.handlers.PanelSolutionsDone,
196+
statusNotification = api.handlers.statusNotification,
197+
["copilot/openURL"] = api.handlers["copilot/openURL"],
198+
}
199+
200+
-- optional handlers
201+
local logger_conf = config.get("logger") --[[@as copilot_config_logging]]
202+
if logger_conf.trace_lsp ~= "off" then
203+
handlers = vim.tbl_extend("force", handlers, {
204+
["$/logTrace"] = logger.handle_lsp_trace,
205+
})
206+
end
207+
208+
if logger_conf.trace_lsp_progress then
209+
handlers = vim.tbl_extend("force", handlers, {
210+
["$/progress"] = logger.handle_lsp_progress,
211+
})
212+
end
213+
214+
if logger_conf.log_lsp_messages then
215+
handlers = vim.tbl_extend("force", handlers, {
216+
["window/logMessage"] = logger.handle_log_lsp_messages,
217+
})
218+
end
219+
220+
return handlers
221+
end
222+
192223
local function prepare_client_config(overrides)
193224
local node = config.get("copilot_node_command")
194225

@@ -217,36 +248,6 @@ local function prepare_client_config(overrides)
217248
workspaceFolders = true,
218249
}
219250

220-
local handlers = {
221-
PanelSolution = api.handlers.PanelSolution,
222-
PanelSolutionsDone = api.handlers.PanelSolutionsDone,
223-
statusNotification = api.handlers.statusNotification,
224-
["copilot/openURL"] = api.handlers["copilot/openURL"],
225-
-- set up "window/logMessage" handler here instead of in `logger.lua`, since some other lsp servers don't support this method, such as jsonlsp
226-
["window/logMessage"] = function(_, result, _)
227-
if not result then
228-
return
229-
end
230-
231-
local message = string.format("LSP message: %s", result.message)
232-
local message_type = result.type --[[@as integer]]
233-
234-
if message_type == 1 then
235-
logger.error(message)
236-
elseif message_type == 2 then
237-
logger.warn(message)
238-
elseif message_type == 3 then
239-
logger.info(message)
240-
elseif message_type == 4 then
241-
logger.info(message)
242-
elseif message_type == 5 then
243-
logger.debug(message)
244-
else
245-
logger.trace(message)
246-
end
247-
end,
248-
}
249-
250251
local root_dir = config.get_root_dir()
251252
local workspace_folders = {
252253
--- @type workspace_folder
@@ -325,7 +326,7 @@ local function prepare_client_config(overrides)
325326
end)
326327
end
327328
end,
328-
handlers = handlers,
329+
handlers = get_handlers(),
329330
init_options = {
330331
copilotIntegrationId = "vscode-chat",
331332
-- Fix LSP warning: editorInfo and editorPluginInfo will soon be required in initializationOptions

lua/copilot/config.lua

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,13 @@ local default_config = {
3737
},
3838
---@class copilot_config_logging
3939
logger = {
40-
log_to_file = false,
4140
file = vim.fn.stdpath("log") .. "/copilot-lua.log",
42-
file_log_level = vim.log.levels.WARN,
43-
print_log = true,
41+
file_log_level = vim.log.levels.OFF,
4442
print_log_level = vim.log.levels.WARN,
4543
---@type string<'off'|'messages'|'verbose'>
4644
trace_lsp = "off",
4745
trace_lsp_progress = false,
46+
log_lsp_messages = false,
4847
},
4948
---@deprecated
5049
ft_disable = nil,

lua/copilot/logger.lua

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ local uv = vim.uv
22

33
---@class logger
44
local mod = {
5-
log_to_file = false,
65
log_file = vim.fn.stdpath("log") .. "/copilot-lua.log",
7-
file_log_level = vim.log.levels.WARN,
8-
print_log = true,
6+
file_log_level = vim.log.levels.OFF,
97
print_log_level = vim.log.levels.WARN,
108
}
119

@@ -75,11 +73,11 @@ end
7573
---@param data any
7674
---@param force_print boolean
7775
function mod.log(log_level, msg, data, force_print)
78-
if mod.log_to_file and (mod.file_log_level <= log_level) then
76+
if mod.file_log_level <= log_level then
7977
write_log(log_level, mod.log_file, msg, data)
8078
end
8179

82-
if force_print or (mod.print_log and (mod.print_log_level <= log_level)) then
80+
if force_print or (mod.print_log_level <= log_level) then
8381
notify_log(log_level, msg, data)
8482
end
8583
end
@@ -125,27 +123,44 @@ function mod.setup(conf)
125123
mod.log_file = conf.file
126124
mod.file_log_level = conf.file_log_level
127125
mod.print_log_level = conf.print_log_level
128-
mod.log_to_file = conf.log_to_file
129-
mod.print_log = conf.print_log
126+
end
130127

131-
if conf.trace_lsp ~= "off" then
132-
vim.lsp.handlers["$/logTrace"] = function(_, result, _)
133-
if not result then
134-
return
135-
end
128+
function mod.handle_lsp_trace(_, result, _)
129+
if not result then
130+
return
131+
end
136132

137-
mod.trace(string.format("LSP trace - %s", result.message), result.verbose)
138-
end
133+
mod.trace(string.format("LSP trace - %s", result.message), result.verbose)
134+
end
135+
136+
function mod.handle_lsp_progress(_, result, _)
137+
if not result then
138+
return
139139
end
140140

141-
if conf.trace_lsp_progress then
142-
vim.lsp.handlers["$/progress"] = function(_, result, _)
143-
if not result then
144-
return
145-
end
141+
mod.trace(string.format("LSP progress - token %s", result.token), result.value)
142+
end
146143

147-
mod.trace(string.format("LSP progress - token %s", result.token), result.value)
148-
end
144+
function mod.handle_log_lsp_messages(_, result, _)
145+
if not result then
146+
return
147+
end
148+
149+
local message = string.format("LSP message: %s", result.message)
150+
local message_type = result.type --[[@as integer]]
151+
152+
if message_type == 1 then
153+
mod.error(message)
154+
elseif message_type == 2 then
155+
mod.warn(message)
156+
elseif message_type == 3 then
157+
mod.info(message)
158+
elseif message_type == 4 then
159+
mod.info(message)
160+
elseif message_type == 5 then
161+
mod.debug(message)
162+
else
163+
mod.trace(message)
149164
end
150165
end
151166

0 commit comments

Comments
 (0)