From c029d90d1975e124d237605f1edb2be16bd05b5d Mon Sep 17 00:00:00 2001 From: Joel Klinghed Date: Tue, 28 Feb 2017 21:50:44 +0100 Subject: Initial commit --- src/logger.cc | 130 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 src/logger.cc (limited to 'src/logger.cc') diff --git a/src/logger.cc b/src/logger.cc new file mode 100644 index 0000000..29dcb38 --- /dev/null +++ b/src/logger.cc @@ -0,0 +1,130 @@ +// -*- mode: c++; c-basic-offset: 2; -*- + +#include "common.hh" + +#ifndef _BSD_SOURCE +#define _BSD_SOURCE +#endif +#ifndef _DEFAULT_SOURCE +#define _DEFAULT_SOURCE +#endif + +#include +#include +#include +#include +#include + +#include "logger.hh" + +namespace { + +class LoggerStdErr : public Logger { +public: + void out(Level UNUSED(lvl), char const* format, ...) override { + char* tmp; + va_list args; + va_start(args, format); + auto ret = vasprintf(&tmp, format, args); + va_end(args); + if (ret == -1) return; + std::cerr << tmp << std::endl; + free(tmp); + } +}; + +class LoggerSyslog : public Logger { +public: + LoggerSyslog(std::string const& name) { + openlog(name.c_str(), LOG_PID, LOG_DAEMON); + } + + ~LoggerSyslog() override { + closelog(); + } + + void out(Level lvl, char const* format, ...) override { + va_list args; + va_start(args, format); + vsyslog(lvl2prio(lvl), format, args); + va_end(args); + } + +private: + static int lvl2prio(Level lvl) { + switch (lvl) { + case ERR: + return LOG_ERR; + case WARN: + return LOG_WARNING; + case INFO: + return LOG_INFO; + } + assert(false); + return LOG_INFO; + } +}; + +class LoggerFile : public Logger { +public: + LoggerFile() + : fh_(nullptr) { + } + + bool open(std::string const& path) { + if (fh_) fclose(fh_); + fh_ = fopen(path.c_str(), "a"); + return fh_ != NULL; + } + + ~LoggerFile() override { + if (fh_) fclose(fh_); + } + + void out(Level lvl, char const* format, ...) override { + fputs(lvl2str(lvl), fh_); + fwrite(": ", 1, 2, fh_); + va_list args; + va_start(args, format); + vfprintf(fh_, format, args); + va_end(args); + fputc('\n', fh_); + } + +private: + static char const* lvl2str(Level lvl) { + switch (lvl) { + case ERR: + return "Error"; + case WARN: + return "Warning"; + case INFO: + return "Info"; + } + assert(false); + return "Info"; + } + + FILE* fh_; +}; + +} // namespace + +// static +Logger* Logger::create_stderr() { + return new LoggerStdErr(); +} + +// static +Logger* Logger::create_syslog(std::string const& name) { + return new LoggerSyslog(name); +} + +// static +Logger* Logger::create_file(std::string const& path) { + std::unique_ptr ret(new LoggerFile()); + if (ret->open(path)) { + return ret.release(); + } + return nullptr; +} -- cgit v1.2.3-70-g09d2