Skip to content
Snippets Groups Projects
Log.cpp 1.72 KiB
Newer Older
Nubben's avatar
Nubben committed
#include "Log.h"

#include "CommandLineParams.h"
#include <streambuf>
#include <map>
#include "StringUtils.h"

namespace {
    class NoStream : public std::streambuf {
    public:
        int overflow(int c) { return c; }
    };

    NoStream noStream;
    std::ostream nothing (&noStream);
    std::map<LogType, Logger> loggerCache;

    
    std::ostream& log(LogType lt) {
        auto cacheEntry = loggerCache.find(lt);
        if (cacheEntry == loggerCache.end()) {
            auto& outStream = ((lt == LogType::ERROR) ? std::cerr : std::cout);
            auto newEntry = std::make_pair(lt, Logger(lt, outStream));
            loggerCache.insert(newEntry);
        }
        return loggerCache[lt]();
Odilitime's avatar
Odilitime committed
    }
Nubben's avatar
Nubben committed
}

Logger::Logger() :
Nubben's avatar
Nubben committed
    outStream(std::cout),
    shouldLog(true) {
}

Logger::Logger(LogType lt, std::ostream& out) : 
    logType(lt), 
    outStream(out), 
    shouldLog(false) {
    std::string specifiedLog = toLowercase(getRelativeCLParam("-log", 1));
    LogType logLevel = LogType::ERROR;
    if (specifiedLog == "warning") {
        logLevel = LogType::WARNING;
    } else if (specifiedLog == "info") {
        logLevel = LogType::INFO;
    } else if (specifiedLog == "debug") {
        logLevel = LogType::DBUG;
Nubben's avatar
Nubben committed
    }

    if (lt <= logLevel) {
        shouldLog = true;
    }
}

std::ostream& Logger::operator()() {
    if (shouldLog) {
        return outStream;
    }
    return nothing;
}

std::ostream& logError() {
    return log(LogType::ERROR);
}

std::ostream& logWarning() {
    return log(LogType::WARNING);
}

std::ostream& logNotice() {
    return log(LogType::NOTICE);
}

Nubben's avatar
Nubben committed
std::ostream& logInfo() {
    return log(LogType::INFO);
}

std::ostream& logDebug() {
    return log(LogType::DBUG);
Nubben's avatar
Nubben committed
}