Program Listing for File BaseLogger.h

Return to documentation for file (axr.sdk/logging/BaseLogger.h)

// Copyright (C) AcceleratXR, Inc. All rights reserved.
//
// Author: Jean-Philippe Steinmetz <info@acceleratxr.com>
#pragma once

#include <cstdio>

#include <cpprest/details/basic_types.h>
#include <fmt/core.h>
#include <fmt/xchar.h>

namespace spdlog
{
class logger;
}


namespace axr
{
namespace sdk
{
namespace logging
{

enum class LogLevel
{
    TRACE,
    DEBUG,
    INFO,
    WARN,
    ERR,
    CRITICAL,
    OFF
};

class BaseLogger
{
public:
    BaseLogger() = default;
    BaseLogger(std::shared_ptr<spdlog::logger> spdlog) : Spdlog(spdlog) {}
    virtual ~BaseLogger() = default;

    LogLevel GetLogLevel() { return Level; }

    virtual void SetLogLevel(const LogLevel level)
    {
        Level = level;
    }

    template<typename ...Args>
    void trace(const utility::string_t& fmt, Args &&...args)
    {
        log(LogLevel::TRACE, fmt, std::forward<Args>(args)...);
    }

    template<typename ...Args>
    void debug(const utility::string_t& fmt, Args &&...args)
    {
        log(LogLevel::DEBUG, fmt, std::forward<Args>(args)...);
    }

    template<typename ...Args>
    void info(const utility::string_t& fmt, Args &&...args)
    {
        log(LogLevel::INFO, fmt, std::forward<Args>(args)...);
    }

    template<typename ...Args>
    void warn(const utility::string_t& fmt, Args &&...args)
    {
        log(LogLevel::WARN, fmt, std::forward<Args>(args)...);
    }

    template<typename ...Args>
    void error(const utility::string_t& fmt, Args &&...args)
    {
        log(LogLevel::ERR, fmt, std::forward<Args>(args)...);
    }

    template<typename ...Args>
    void critial(const utility::string_t& fmt, Args &&...args)
    {
        log(LogLevel::CRITICAL, fmt, std::forward<Args>(args)...);
    }

    template<typename... Args>
    void log(const LogLevel level, const utility::string_t& fmt, Args &&...args)
    {
        InternalLog(level, fmt::format(fmt, std::forward<Args>(args)...));
    }

protected:
    std::shared_ptr<spdlog::logger> Spdlog = nullptr;

    virtual void InternalLog(const LogLevel level, const utility::string_t& str) = 0;

private:
    LogLevel Level = LogLevel::OFF;
};


} // namespace logging
} // namespace sdk
} // namespace axr