1*7bc52733SRiver Riddle //===- Logging.cpp --------------------------------------------------------===//
2*7bc52733SRiver Riddle //
3*7bc52733SRiver Riddle // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7bc52733SRiver Riddle // See https://llvm.org/LICENSE.txt for license information.
5*7bc52733SRiver Riddle // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7bc52733SRiver Riddle //
7*7bc52733SRiver Riddle //===----------------------------------------------------------------------===//
8*7bc52733SRiver Riddle 
9*7bc52733SRiver Riddle #include "Logging.h"
10*7bc52733SRiver Riddle #include "llvm/Support/Chrono.h"
11*7bc52733SRiver Riddle #include "llvm/Support/ManagedStatic.h"
12*7bc52733SRiver Riddle #include "llvm/Support/raw_ostream.h"
13*7bc52733SRiver Riddle 
14*7bc52733SRiver Riddle using namespace mlir;
15*7bc52733SRiver Riddle using namespace mlir::lsp;
16*7bc52733SRiver Riddle 
setLogLevel(Level logLevel)17*7bc52733SRiver Riddle void Logger::setLogLevel(Level logLevel) { get().logLevel = logLevel; }
18*7bc52733SRiver Riddle 
get()19*7bc52733SRiver Riddle Logger &Logger::get() {
20*7bc52733SRiver Riddle   static Logger logger;
21*7bc52733SRiver Riddle   return logger;
22*7bc52733SRiver Riddle }
23*7bc52733SRiver Riddle 
log(Level logLevel,const char * fmt,const llvm::formatv_object_base & message)24*7bc52733SRiver Riddle void Logger::log(Level logLevel, const char *fmt,
25*7bc52733SRiver Riddle                  const llvm::formatv_object_base &message) {
26*7bc52733SRiver Riddle   Logger &logger = get();
27*7bc52733SRiver Riddle 
28*7bc52733SRiver Riddle   // Ignore messages with log levels below the current setting in the logger.
29*7bc52733SRiver Riddle   if (logLevel < logger.logLevel)
30*7bc52733SRiver Riddle     return;
31*7bc52733SRiver Riddle 
32*7bc52733SRiver Riddle   // An indicator character for each log level.
33*7bc52733SRiver Riddle   const char *logLevelIndicators = "DIE";
34*7bc52733SRiver Riddle 
35*7bc52733SRiver Riddle   // Format the message and print to errs.
36*7bc52733SRiver Riddle   llvm::sys::TimePoint<> timestamp = std::chrono::system_clock::now();
37*7bc52733SRiver Riddle   std::lock_guard<std::mutex> logGuard(logger.mutex);
38*7bc52733SRiver Riddle   llvm::errs() << llvm::formatv(
39*7bc52733SRiver Riddle       "{0}[{1:%H:%M:%S.%L}] {2}\n",
40*7bc52733SRiver Riddle       logLevelIndicators[static_cast<unsigned>(logLevel)], timestamp, message);
41*7bc52733SRiver Riddle   llvm::errs().flush();
42*7bc52733SRiver Riddle }
43