Mercurial > irccd
diff common/logger.h @ 0:1158cffe5a5e
Initial import
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 08 Feb 2016 16:43:14 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common/logger.h Mon Feb 08 16:43:14 2016 +0100 @@ -0,0 +1,217 @@ +/* + * logger.h -- irccd logging + * + * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#ifndef _IRCCD_LOGGER_H_ +#define _IRCCD_LOGGER_H_ + +#include <irccd-config.h> + +#include <memory> +#include <sstream> +#include <utility> + +namespace irccd { + +namespace log { + +/** + * @enum Level + * @brief Which level of warning + */ +enum class Level { + Info, //!< Standard information (disabled if verbose is false) + Warning, //!< Warning (always shown) + Debug //!< Debug message (only if compiled in debug mode) +}; + +/* -------------------------------------------------------- + * Interface -- abstract logging interface + * -------------------------------------------------------- */ + +/** + * @class Interface + * @brief Interface to implement new logger mechanisms + * + * Derive from this class and use Logger::setInterface() to change logging + * system. + * + * @see File + * @see Console + * @see Syslog + * @see Silent + */ +class Interface { +public: + /** + * Write the line to the logs. The line to write will never contains + * trailing new line character. + * + * @param level the level + * @param line the line without trailing \n + */ + virtual void write(Level level, const std::string &line) noexcept = 0; +}; + +/* -------------------------------------------------------- + * Console -- logs to console + * -------------------------------------------------------- */ + +/** + * @class Console + * @brief Logger implementation for console output + */ +class Console : public Interface { +public: + /** + * @copydoc Interface::write + */ + void write(Level level, const std::string &line) noexcept override; +}; + +/* -------------------------------------------------------- + * File -- logs to a file + * -------------------------------------------------------- */ + +/** + * @class File + * @brief Output to a file + */ +class File : public Interface { +private: + std::string m_outputNormal; + std::string m_outputError; + +public: + /** + * Outputs to files. Info and Debug are written in normal and Warnings + * in errors. + * + * The same path can be used for all levels. + * + * @param normal the path to the normal logs + * @param errors the path to the errors logs + */ + File(std::string normal, std::string errors); + + /** + * @copydoc Interface::write + */ + void write(Level level, const std::string &line) noexcept override; +}; + +/* -------------------------------------------------------- + * Silent -- disable all logs + * -------------------------------------------------------- */ + +/** + * @class Silent + * @brief Use to disable logs + * + * Useful for unit tests when some classes may emits log. + */ +class Silent : public Interface { +public: + /** + * @copydoc Interface::write + */ + void write(Level level, const std::string &line) noexcept override; +}; + +/* -------------------------------------------------------- + * Syslog -- system logger + * -------------------------------------------------------- */ + +#if defined(HAVE_SYSLOG) + +/** + * @class Syslog + * @brief Implements logger into syslog + */ +class Syslog : public Interface { +public: + /** + * Open the syslog. + */ + Syslog(); + + /** + * Close the syslog. + */ + ~Syslog(); + + /** + * @copydoc Interface::write + */ + void write(Level level, const std::string &line) noexcept override; +}; + +#endif // !HAVE_SYSLOG + +/* -------------------------------------------------------- + * Functions + * -------------------------------------------------------- */ + +/** + * Update the logger interface. + * + * @param iface the new interface + */ +void setInterface(std::unique_ptr<Interface> iface) noexcept; + +/** + * Get the stream for informational messages. + * + * @return the stream + * @note Has no effect if verbose is set to false. + */ +std::ostream &info() noexcept; + +/** + * Get the stream for warnings. + * + * @return the stream + */ +std::ostream &warning() noexcept; + +/** + * Get the stream for debug messages. + * + * @return the stream + * @note Has no effect if compiled in release mode. + */ +std::ostream &debug() noexcept; + +/** + * Tells if verbose is enabled. + * + * @return true if enabled + */ +bool isVerbose() noexcept; + +/** + * Set the verbosity mode. + * + * @param mode the new mode + */ +void setVerbose(bool mode) noexcept; + +} // !log + +} // !irccd + +#endif // !_IRCCD_LOGGER_H_