From c481a7cf3801f3dc858e956f05580dae35436453 Mon Sep 17 00:00:00 2001 From: Danny Robson Date: Tue, 21 Apr 2020 10:55:36 +1000 Subject: [PATCH] log/sink: implement ostream sink --- log/sink/ostream.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++++ log/sink/ostream.hpp | 31 +++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/log/sink/ostream.cpp b/log/sink/ostream.cpp index e69de29b..018cd1d8 100644 --- a/log/sink/ostream.cpp +++ b/log/sink/ostream.cpp @@ -0,0 +1,54 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2020, Danny Robson + */ + +#include "ostream.hpp" + +#include "../level.hpp" +#include "../packet.hpp" + +using cruft::log::sink::ostream; + + +/////////////////////////////////////////////////////////////////////////////// +ostream::ostream (std::string name, std::filesystem::path const &dst) + : crtp (std::move (name)) + , m_output (dst) +{ ; } + + +/////////////////////////////////////////////////////////////////////////////// +void +ostream::write (packet const &val) +{ + if (val.level > log_level ()) + return; + + static const size_t time_len = strlen("YYYY-mm-dd HHMMhSS") + 1; + std::string time_string (time_len - 1, '\0'); + time_t unix_time = time (nullptr); + + if (0 == strftime (&time_string[0], + time_len, + "%Y-%m-%d %H%Mh%S", + localtime (&unix_time))) + { + warn ("failed to log time"); + return; + } + + m_output + << time_string << " [" + << std::setw (cruft::cast::lossless (level_width ())) + << std::left + << val.level + << std::setw (0) + << "] " << val.message << std::endl; + + if (needs_break (val.level)) + breakpoint (); +} diff --git a/log/sink/ostream.hpp b/log/sink/ostream.hpp index e69de29b..564b46d4 100644 --- a/log/sink/ostream.hpp +++ b/log/sink/ostream.hpp @@ -0,0 +1,31 @@ +/* + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + * + * Copyright 2020, Danny Robson + */ + +#pragma once + +#include "base.hpp" + +#include +#include +#include + + +namespace cruft::log::sink { + class ostream : public crtp { + public: + ostream ( + std::string name, + std::filesystem::path const &path + ); + + void write (packet const&) override; + + private: + std::ofstream m_output; + }; +}