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 Riddlevoid Logger::setLogLevel(Level logLevel) { get().logLevel = logLevel; } 18*7bc52733SRiver Riddle get()19*7bc52733SRiver RiddleLogger &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 Riddlevoid 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