🐛 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.
This commit is contained in:
csh 2025-12-14 13:43:56 +08:00
parent 241de77152
commit 9a12b1b194
2 changed files with 13 additions and 7 deletions

View File

@ -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

View File

@ -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=<level> 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=<path> 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=<count> Number of worker threads\\n"
<< " --interpreter=<path> Custom interpreter path\\n";
}