#ifndef LOGGER_HH #define LOGGER_HH #include #include #include class Logger { public: virtual ~Logger() = default; static std::unique_ptr create_stdio(); // Can return nullptr, will write reason to fallback. static std::unique_ptr create_file(std::filesystem::path const& path, Logger* fallback); static std::unique_ptr create_syslog(std::string const& prgname); static std::unique_ptr create_null(); virtual void err(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) // this takes up 1 #endif // HAVE_ATTRIBUTE_FORMAT = 0; virtual void warn(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT = 0; virtual void info(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT = 0; #ifdef NDEBUG void dbg(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT {} #else virtual void dbg(char const* format, ...) #if HAVE_ATTRIBUTE_FORMAT __attribute__((format(printf, 2, 3))) #endif // HAVE_ATTRIBUTE_FORMAT = 0; #endif protected: Logger() = default; Logger(Logger const&) = delete; Logger& operator=(Logger const&) = delete; }; #endif // LOGGER_HH