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"; }