From 9a12b1b1948b4ea6803a2c5e33b4df6388812b4f Mon Sep 17 00:00:00 2001 From: csh Date: Sun, 14 Dec 2025 13:43:56 +0800 Subject: [PATCH] :bug: fix(logging): support --log-stderr and clarify stdin wait - Make logs go to stderr by default (keep LSP stdout clean). - Add --log-stderr/--log-stdout flags and wire config.use_stderr into spdlog. - Log an explicit message when waiting for LSP input on stdin. --- lsp-server/src/core/server.cppm | 1 + lsp-server/src/utils/args_parser.cppm | 19 ++++++++++++------- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/lsp-server/src/core/server.cppm b/lsp-server/src/core/server.cppm index 133f5a9..239ab9b 100644 --- a/lsp-server/src/core/server.cppm +++ b/lsp-server/src/core/server.cppm @@ -112,6 +112,7 @@ namespace lsp::core void LspServer::Run() { spdlog::info("LSP server starting main loop..."); + spdlog::info("Waiting for LSP messages on stdin..."); // 设置二进制模式 #ifdef _WIN32 diff --git a/lsp-server/src/utils/args_parser.cppm b/lsp-server/src/utils/args_parser.cppm index 77b6e5e..4cc5d95 100644 --- a/lsp-server/src/utils/args_parser.cppm +++ b/lsp-server/src/utils/args_parser.cppm @@ -52,7 +52,9 @@ namespace lsp::utils const ServerConfig& ArgsParser::Parse(int argc, char* argv[]) { config_ = ServerConfig{}; - bool use_stdio = false; + // Default to stderr so LSP stdio (stdout) stays clean. + config_.use_stderr = true; + for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; @@ -75,10 +77,14 @@ namespace lsp::utils config_.log_level = spdlog::level::err; else if (arg == "--log=off") config_.log_level = spdlog::level::off; + else if (arg == "--log-stderr") + config_.use_stderr = true; + else if (arg == "--log-stdout") + config_.use_stderr = false; else if (arg.find("--log-file=") == 0) config_.log_file = arg.substr(std::strlen("--log-file=")); else if (arg == "--use-stdio") - use_stdio = true; + config_.use_stderr = true; else if (arg.find("--threads=") == 0) { auto value = arg.substr(std::strlen("--threads=")); @@ -90,9 +96,6 @@ namespace lsp::utils } } - if (!use_stdio) - config_.use_stderr = true; - return config_; } @@ -113,7 +116,7 @@ namespace lsp::utils } else { - auto console_logger = spdlog::stdout_logger_mt("console_logger"); + auto console_logger = config.use_stderr ? spdlog::stderr_logger_mt("console_logger") : spdlog::stdout_logger_mt("console_logger"); console_logger->set_level(config.log_level); spdlog::set_default_logger(console_logger); } @@ -127,8 +130,10 @@ namespace lsp::utils << "Options:\\n" << " --help Show this help message\\n" << " --log= Set log level (trace, debug, info, warn, error, off)\\n" + << " --log-stderr Output logs to stderr (default)\\n" + << " --log-stdout Output logs to stdout\\n" << " --log-file= Output logs to specified file\\n" - << " --use-stdio Use stdin/stdout for I/O (default: stderr)\\n" + << " --use-stdio Alias for --log-stderr (keep stdout clean for LSP)\\n" << " --threads= Number of worker threads\\n" << " --interpreter= Custom interpreter path\\n"; }