[clang-tools-extra] 8f2bf93 - [clangd] Introduce a log-prefix flag to remote-index-server
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 25 07:52:28 PDT 2021
Author: Kadir Cetinkaya
Date: 2021-06-25T16:51:29+02:00
New Revision: 8f2bf93b5bd6a1d31e28e4144827b3f6c413ac85
URL: https://github.com/llvm/llvm-project/commit/8f2bf93b5bd6a1d31e28e4144827b3f6c413ac85
DIFF: https://github.com/llvm/llvm-project/commit/8f2bf93b5bd6a1d31e28e4144827b3f6c413ac85.diff
LOG: [clangd] Introduce a log-prefix flag to remote-index-server
Differential Revision: https://reviews.llvm.org/D104843
Added:
clang-tools-extra/clangd/test/remote-index/log-prefix.test
Modified:
clang-tools-extra/clangd/index/remote/server/Server.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/index/remote/server/Server.cpp b/clang-tools-extra/clangd/index/remote/server/Server.cpp
index 4f4e80b8a4d74..04ad0b2a1936f 100644
--- a/clang-tools-extra/clangd/index/remote/server/Server.cpp
+++ b/clang-tools-extra/clangd/index/remote/server/Server.cpp
@@ -37,7 +37,9 @@
#include <grpc++/grpc++.h>
#include <grpc++/health_check_service_interface.h>
#include <memory>
+#include <string>
#include <thread>
+#include <utility>
#if ENABLE_GRPC_REFLECTION
#include <grpc++/ext/proto_server_reflection_plugin.h>
@@ -78,6 +80,12 @@ llvm::cl::opt<bool> LogPublic{
llvm::cl::init(false),
};
+llvm::cl::opt<std::string> LogPrefix{
+ "log-prefix",
+ llvm::cl::desc("A string that'll be prepended to all log statements. "
+ "Useful when running multiple instances on same host."),
+};
+
llvm::cl::opt<std::string> TraceFile(
"trace-file",
llvm::cl::desc("Path to the file where tracer logs will be stored"));
@@ -427,27 +435,48 @@ void runServerAndWait(clangd::SymbolIndex &Index, llvm::StringRef ServerAddress,
ServerShutdownWatcher.join();
}
-std::unique_ptr<Logger> makeLogger(llvm::raw_ostream &OS) {
- if (!LogPublic)
- return std::make_unique<StreamLogger>(OS, LogLevel);
- // Redacted mode:
- // - messages outside the scope of a request: log fully
- // - messages tagged [public]: log fully
- // - errors: log the format string
- // - others: drop
- class RedactedLogger : public StreamLogger {
+std::unique_ptr<Logger> makeLogger(llvm::StringRef LogPrefix,
+ llvm::raw_ostream &OS) {
+ std::unique_ptr<Logger> Base;
+ if (LogPublic) {
+ // Redacted mode:
+ // - messages outside the scope of a request: log fully
+ // - messages tagged [public]: log fully
+ // - errors: log the format string
+ // - others: drop
+ class RedactedLogger : public StreamLogger {
+ public:
+ using StreamLogger::StreamLogger;
+ void log(Level L, const char *Fmt,
+ const llvm::formatv_object_base &Message) override {
+ if (Context::current().get(CurrentRequest) == nullptr ||
+ llvm::StringRef(Fmt).startswith("[public]"))
+ return StreamLogger::log(L, Fmt, Message);
+ if (L >= Error)
+ return StreamLogger::log(L, Fmt,
+ llvm::formatv("[redacted] {0}", Fmt));
+ }
+ };
+ Base = std::make_unique<RedactedLogger>(OS, LogLevel);
+ } else {
+ Base = std::make_unique<StreamLogger>(OS, LogLevel);
+ }
+
+ if (LogPrefix.empty())
+ return Base;
+ class PrefixedLogger : public Logger {
+ std::string LogPrefix;
+ std::unique_ptr<Logger> Base;
+
public:
- using StreamLogger::StreamLogger;
+ PrefixedLogger(llvm::StringRef LogPrefix, std::unique_ptr<Logger> Base)
+ : LogPrefix(LogPrefix.str()), Base(std::move(Base)) {}
void log(Level L, const char *Fmt,
const llvm::formatv_object_base &Message) override {
- if (Context::current().get(CurrentRequest) == nullptr ||
- llvm::StringRef(Fmt).startswith("[public]"))
- return StreamLogger::log(L, Fmt, Message);
- if (L >= Error)
- return StreamLogger::log(L, Fmt, llvm::formatv("[redacted] {0}", Fmt));
+ Base->log(L, Fmt, llvm::formatv("[{0}] {1}", LogPrefix, Message));
}
};
- return std::make_unique<RedactedLogger>(OS, LogLevel);
+ return std::make_unique<PrefixedLogger>(LogPrefix, std::move(Base));
}
} // namespace
@@ -471,7 +500,7 @@ int main(int argc, char *argv[]) {
llvm::errs().SetBuffered();
// Don't flush stdout when logging for thread safety.
llvm::errs().tie(nullptr);
- auto Logger = makeLogger(llvm::errs());
+ auto Logger = makeLogger(LogPrefix.getValue(), llvm::errs());
clang::clangd::LoggingSession LoggingSession(*Logger);
llvm::Optional<llvm::raw_fd_ostream> TracerStream;
diff --git a/clang-tools-extra/clangd/test/remote-index/log-prefix.test b/clang-tools-extra/clangd/test/remote-index/log-prefix.test
new file mode 100644
index 0000000000000..fb00576bbd5c4
--- /dev/null
+++ b/clang-tools-extra/clangd/test/remote-index/log-prefix.test
@@ -0,0 +1,18 @@
+# RUN: rm -rf %t
+# RUN: clangd-indexer %S/Inputs/Source.cpp > %t.idx
+# RUN: %python %S/pipeline_helper.py --input-file-name=%s --server-arg=--log=verbose --server-arg=-log-prefix=test-prefix --server-log=%t.log --project-root=%S --index-file=%t.idx > /dev/null
+# RUN: FileCheck %s < %t.log
+# REQUIRES: clangd-remote-index
+
+# CHECK: [test-prefix] Server listening on
+{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{},"trace":"off"}}
+---
+{"jsonrpc":"2.0","id":1,"method":"workspace/symbol","params":{"query":"gFoo"}}
+# CHECK: [test-prefix] <<< FuzzyFindRequest
+# CHECK: [test-prefix] >>> FuzzyFindReply
+# CHECK: [test-prefix] [public] request v1/FuzzyFind
+---
+{"jsonrpc":"2.0","id":4,"method":"shutdown"}
+---
+{"jsonrpc":"2.0","method":"exit"}
+
More information about the cfe-commits
mailing list