[PATCH] D84697: [clangd] Use elog instead of llvm::errs, log instead of llvm::outs

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jul 27 13:23:23 PDT 2020


sammccall added a comment.

Thanks for sending this... after looking at the examples and thinking again about our conversation I may have shifted a bit :-\

I think it's important *log() should only be used for messages intended to be logged! (i.e. read later as a sequence of log messages).
We happen to write these to stderr by default, but this is an implementation detail that I'd like to leave flexible.

So a good question is: "if we were writing the log to a different file instead, would we want to write this there or stderr?"
By that measure:

- the messages followed by exit() should go to stderr
- dexp's output should go to stder
- the others seem good to go to the log

WDYT?



================
Comment at: clang-tools-extra/clangd/benchmarks/IndexBenchmark.cpp:101
   if (argc < 3) {
-    llvm::errs() << "Usage: " << argv[0]
-                 << " global-symbol-index.yaml requests.json "
-                    "BENCHMARK_OPTIONS...\n";
+    clang::clangd::elog("Usage: {0} global-symbol-index.yaml requests.json "
+                        "BENCHMARK_OPTIONS...",
----------------
this is fine, but just writes to errs with no log formatting... you need to set up a logger if you want one.


================
Comment at: clang-tools-extra/clangd/index/dex/dexp/Dexp.cpp:185
     if (ID.getNumOccurrences() == 0 && Name.getNumOccurrences() == 0) {
-      llvm::errs()
-          << "Missing required argument: please provide id or -name.\n";
+      elog("Missing required argument: please provide id or -name.");
       return;
----------------
hmm... since this is explicitly supposed to be an interactive tool, I think "we are writing to stderr" is important rather than a detail to be abstracted.

e.g. there's no timestamp etc decoration (which is good!) because you haven't installed an actual logger and the fallback behavior is to write to stderr. But neither of these things are explicit at the callsite and either could be changed elsewhere.


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:176
   std::unique_ptr<grpc::Server> Server(Builder.BuildAndStart());
-  llvm::outs() << "Server listening on " << ServerAddress << '\n';
+  vlog("Server listening on {0}", ServerAddress);
 
----------------
I'd suggest this is log() rather than vlog() - the port is sometimes important to know but *progress through the startup sequence* is useful to have in the log.


================
Comment at: clang-tools-extra/clangd/indexer/IndexerMain.cpp:116
   if (!Executor) {
-    llvm::errs() << llvm::toString(Executor.takeError()) << "\n";
+    clang::clangd::elog("{0}", llvm::toString(Executor.takeError()));
     return 1;
----------------
unneccesary toString


================
Comment at: clang-tools-extra/clangd/indexer/IndexerMain.cpp:126
   if (Err) {
-    llvm::errs() << llvm::toString(std::move(Err)) << "\n";
+    clang::clangd::elog("{0}", llvm::toString(std::move(Err)));
   }
----------------
unneccesary toString


================
Comment at: clang-tools-extra/clangd/tool/ClangdMain.cpp:567
   if (!Sync && WorkerThreadsCount == 0) {
-    llvm::errs() << "A number of worker threads cannot be 0. Did you mean to "
-                    "specify -sync?";
+    elog("A number of worker threads cannot be 0. Did you mean to "
+         "specify -sync?");
----------------
Don't use elog before the logger is set up to print messages to stderr - it seems needlessly confusing where the current version is very clear.

(it *is* better for the basic validation to happen early and us to log flag failures "before the stream enters log mode" where it's convenient)


================
Comment at: clang-tools-extra/clangd/tool/ClangdMain.cpp:624
   if (llvm::outs().is_displayed() && llvm::errs().is_displayed())
-    llvm::errs() << Overview << "\n";
+    elog(Overview);
   // Use buffered stream to stderr (we still flush each log message). Unbuffered
----------------
this isn't an error, and we're explicitly trying to get it in front of the user *before* the log starts


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D84697/new/

https://reviews.llvm.org/D84697





More information about the cfe-commits mailing list