xref: /llvm-project/mlir/lib/Tools/lsp-server-support/Logging.cpp (revision 305d718539659fb5fccd9b6e0771bbabc6c3c821)
17bc52733SRiver Riddle //===- Logging.cpp --------------------------------------------------------===//
27bc52733SRiver Riddle //
37bc52733SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47bc52733SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
57bc52733SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67bc52733SRiver Riddle //
77bc52733SRiver Riddle //===----------------------------------------------------------------------===//
87bc52733SRiver Riddle 
9*305d7185SRiver Riddle #include "mlir/Tools/lsp-server-support/Logging.h"
107bc52733SRiver Riddle #include "llvm/Support/Chrono.h"
117bc52733SRiver Riddle #include "llvm/Support/ManagedStatic.h"
127bc52733SRiver Riddle #include "llvm/Support/raw_ostream.h"
137bc52733SRiver Riddle 
147bc52733SRiver Riddle using namespace mlir;
157bc52733SRiver Riddle using namespace mlir::lsp;
167bc52733SRiver Riddle 
setLogLevel(Level logLevel)177bc52733SRiver Riddle void Logger::setLogLevel(Level logLevel) { get().logLevel = logLevel; }
187bc52733SRiver Riddle 
get()197bc52733SRiver Riddle Logger &Logger::get() {
207bc52733SRiver Riddle   static Logger logger;
217bc52733SRiver Riddle   return logger;
227bc52733SRiver Riddle }
237bc52733SRiver Riddle 
log(Level logLevel,const char * fmt,const llvm::formatv_object_base & message)247bc52733SRiver Riddle void Logger::log(Level logLevel, const char *fmt,
257bc52733SRiver Riddle                  const llvm::formatv_object_base &message) {
267bc52733SRiver Riddle   Logger &logger = get();
277bc52733SRiver Riddle 
287bc52733SRiver Riddle   // Ignore messages with log levels below the current setting in the logger.
297bc52733SRiver Riddle   if (logLevel < logger.logLevel)
307bc52733SRiver Riddle     return;
317bc52733SRiver Riddle 
327bc52733SRiver Riddle   // An indicator character for each log level.
337bc52733SRiver Riddle   const char *logLevelIndicators = "DIE";
347bc52733SRiver Riddle 
357bc52733SRiver Riddle   // Format the message and print to errs.
367bc52733SRiver Riddle   llvm::sys::TimePoint<> timestamp = std::chrono::system_clock::now();
377bc52733SRiver Riddle   std::lock_guard<std::mutex> logGuard(logger.mutex);
387bc52733SRiver Riddle   llvm::errs() << llvm::formatv(
397bc52733SRiver Riddle       "{0}[{1:%H:%M:%S.%L}] {2}\n",
407bc52733SRiver Riddle       logLevelIndicators[static_cast<unsigned>(logLevel)], timestamp, message);
417bc52733SRiver Riddle   llvm::errs().flush();
427bc52733SRiver Riddle }
43