| //===- Logging.h - General logging class ------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// |
| /// \file |
| /// Provides ompTest-tailored logging, with log-levels and formatting/coloring. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef OPENMP_TOOLS_OMPTEST_INCLUDE_LOGGING_H |
| #define OPENMP_TOOLS_OMPTEST_INCLUDE_LOGGING_H |
| |
| #include "OmptAssertEvent.h" |
| |
| #include <iostream> |
| #include <map> |
| #include <mutex> |
| #include <set> |
| #include <sstream> |
| #include <string> |
| |
| namespace omptest { |
| namespace logging { |
| |
| enum class Level : uint32_t { |
| // Levels (Note: DEBUG may already be reserved) |
| Diagnostic = 10, |
| Info = 20, |
| Warning = 30, |
| Error = 40, |
| Critical = 50, |
| |
| // Types used for formatting options |
| Default, |
| ExpectedEvent, |
| ObservedEvent, |
| OffendingEvent, |
| |
| // Suppress all prints |
| Silent = 0xFFFFFFFF |
| }; |
| |
| enum class FormatOption : uint32_t { |
| // General options |
| // Note: Bold is actually "BRIGHT" -- But it will be perceived as 'bold' font |
| // It is implicitly switching colors to the 'Light' variant |
| // Thus, it has -NO EFFECT- when already using a Light* color |
| None = 0, |
| Bold = 1, |
| Dim = 2, |
| Underlined = 4, |
| Blink = 5, |
| Inverted = 7, |
| Hidden = 8, |
| // Foreground colors |
| ColorDefault = 39, |
| ColorBlack = 30, |
| ColorRed = 31, |
| ColorGreen = 32, |
| ColorYellow = 33, |
| ColorBlue = 34, |
| ColorMagenta = 35, |
| ColorCyan = 36, |
| ColorLightGray = 37, |
| ColorDarkGray = 90, |
| ColorLightRed = 91, |
| ColorLightGreen = 92, |
| ColorLightYellow = 93, |
| ColorLightBlue = 94, |
| ColorLightMagenta = 95, |
| ColorLightCyan = 96, |
| ColorWhite = 97, |
| // Background colors |
| ColorBackgroundDefault = 49, |
| ColorBackgroundBlack = 40, |
| ColorBackgroundRed = 41, |
| ColorBackgroundGreen = 42, |
| ColorBackgroundYellow = 43, |
| ColorBackgroundBlue = 44, |
| ColorBackgroundMagenta = 45, |
| ColorBackgroundCyan = 46, |
| ColorBackgroundLightGray = 47, |
| ColorBackgroundDarkGray = 100, |
| ColorBackgroundLightRed = 101, |
| ColorBackgroundLightGreen = 102, |
| ColorBackgroundLightYellow = 103, |
| ColorBackgroundLightBlue = 104, |
| ColorBackgroundLightMagenta = 105, |
| ColorBackgroundLightCyan = 106, |
| ColorBackgroundWhite = 107 |
| }; |
| |
| /// Returns a string representation of the given logging level. |
| const char *to_string(Level LogLevel); |
| |
| /// Returns the format options as escaped sequence, for the given logging level |
| std::string getFormatSequence(Level LogLevel = Level::Default); |
| |
| /// Format the given message with the provided option(s) and return it. |
| /// Here formatting is only concerning control sequences using <Esc> character |
| /// which can be obtained using '\e' (on console), '\033' or '\x1B'. |
| std::string format(const std::string &Message, FormatOption Option); |
| std::string format(const std::string &Message, std::set<FormatOption> Options); |
| |
| class Logger { |
| public: |
| Logger(Level LogLevel = Level::Warning, std::ostream &OutStream = std::cerr, |
| bool FormatOutput = true); |
| ~Logger(); |
| |
| /// Log the given message to the output. |
| void log(const std::string &Message, Level LogLevel) const; |
| |
| /// Log a single event mismatch. |
| void logEventMismatch(const std::string &Message, |
| const omptest::OmptAssertEvent &OffendingEvent, |
| Level LogLevel = Level::Error) const; |
| |
| /// Log an event-pair mismatch. |
| void logEventMismatch(const std::string &Message, |
| const omptest::OmptAssertEvent &ExpectedEvent, |
| const omptest::OmptAssertEvent &ObservedEvent, |
| Level LogLevel = Level::Error) const; |
| |
| /// Set if output is being formatted (e.g. colored). |
| void setFormatOutput(bool Enabled); |
| |
| /// Return the current (minimum) Logging Level. |
| Level getLoggingLevel() const; |
| |
| /// Set the (minimum) Logging Level. |
| void setLoggingLevel(Level LogLevel); |
| |
| private: |
| /// The minimum logging level that is considered by the logger instance. |
| Level LoggingLevel; |
| |
| /// The output stream used by the logger instance. |
| std::ostream &OutStream; |
| |
| /// Determine if log messages are formatted using control sequences. |
| bool FormatOutput; |
| |
| /// Mutex to ensure serialized logging |
| mutable std::mutex LogMutex; |
| }; |
| |
| } // namespace logging |
| } // namespace omptest |
| |
| #endif |