blob: a8a1333795859d348e36e0c47ddf133ff8267cee [file] [log] [blame]
//===- 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