Program Listing for File Logger.cpp

Return to documentation for file (umpire/util/Logger.cpp)

//////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2016-20, Lawrence Livermore National Security, LLC and Umpire
// project contributors. See the COPYRIGHT file for details.
//
// SPDX-License-Identifier: (MIT)
//////////////////////////////////////////////////////////////////////////////

#include "umpire/util/Logger.hpp"
#include "umpire/util/io.hpp"

#include <cstdlib>    // for getenv()
#include <cctype>     // for std::toupper
#include <algorithm>  // for std::equal

namespace umpire {
namespace util {

static const char* env_name = "UMPIRE_LOG_LEVEL";
static message::Level defaultLevel = message::Info;

static const char* MessageLevelName[message::Num_Levels] = {
  "ERROR",
  "WARNING",
  "INFO",
  "DEBUG"
};

static int case_insensitive_match(const std::string s1, const std::string s2) {
  return (s1.size() == s2.size()) &&
          std::equal(s1.begin(), s1.end(), s2.begin(), [] (char c1, char c2) {
            return (std::toupper(c1) == std::toupper(c2));
          });
}

Logger::Logger() noexcept :
  // by default, all message streams are disabled
  m_is_enabled{false, false, false, false}
{
  message::Level level{defaultLevel};
  const char* enval = getenv(env_name);

  if (enval) {
    for (int i = 0; i < message::Num_Levels; ++i) {
      if (case_insensitive_match(enval, MessageLevelName[i])) {
        level = static_cast<message::Level>(i);
        break;
      }
    }
  }

  setLoggingMsgLevel(level);
}

void Logger::setLoggingMsgLevel( message::Level level ) noexcept
{
  for (int i=0; i < message::Num_Levels; ++i)
    m_is_enabled[i] = (i<=level);
}

void Logger::logMessage( message::Level level,
                         const std::string& message,
                         const std::string& fileName,
                         int line ) noexcept
{
  if (!logLevelEnabled(level)) return;

  umpire::log()
    << "[" << MessageLevelName[level] << "]"
    << "[" << fileName  << ":" << line << "]:"
    << message
    << std::endl;
}

Logger* Logger::getActiveLogger()
{
  static Logger logger;
  return &logger;
}

} // end namespace util
} // end namespace umpire