loolwsd/Log.cpp | 135 ++++++++++++++++++++++++++++++++++++++++++++++++++++ loolwsd/Log.hpp | 121 ++++++++++++++++++++++++++++++++++++++++++++++ loolwsd/Makefile.am | 19 ++++--- loolwsd/Util.cpp | 117 --------------------------------------------- loolwsd/Util.hpp | 103 --------------------------------------- 5 files changed, 272 insertions(+), 223 deletions(-)
New commits: commit 322a3c1afe83a88f6bd3519eb504525f9016cc84 Author: Ashod Nakashian <ashod.nakash...@collabora.co.uk> Date: Thu Apr 14 20:12:43 2016 -0400 loolwsd: logging moved to own files Change-Id: Idf1dd91cf37675e1bea8aeb5d9e8cf6d2ac9a725 Reviewed-on: https://gerrit.libreoffice.org/24099 Reviewed-by: Ashod Nakashian <ashnak...@gmail.com> Tested-by: Ashod Nakashian <ashnak...@gmail.com> diff --git a/loolwsd/Log.cpp b/loolwsd/Log.cpp new file mode 100644 index 0000000..48fe800 --- /dev/null +++ b/loolwsd/Log.cpp @@ -0,0 +1,135 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * 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/. + */ + +#include <sys/prctl.h> + +#include <cassert> +#include <iomanip> +#include <sstream> +#include <string> + +#include <Poco/ConsoleChannel.h> +#include <Poco/Process.h> +#include <Poco/Thread.h> + +#include "Log.hpp" + +static char LogPrefix[256] = { '\0' }; + +namespace Log +{ + static const Poco::Int64 epochStart = Poco::Timestamp().epochMicroseconds(); + // help avoid destruction ordering issues. + struct StaticNames { + bool inited; + std::string name; + std::string id; + StaticNames() : + inited(true) + { + } + ~StaticNames() + { + inited = false; + } + }; + static StaticNames Source; + + std::string prefix() + { + Poco::Int64 usec = Poco::Timestamp().epochMicroseconds() - epochStart; + + const Poco::Int64 one_s = 1000000; + const Poco::Int64 hours = usec / (one_s*60*60); + usec %= (one_s*60*60); + const Poco::Int64 minutes = usec / (one_s*60); + usec %= (one_s*60); + const Poco::Int64 seconds = usec / (one_s); + usec %= (one_s); + + std::ostringstream stream; + stream << (Source.inited ? Source.id : std::string()) + << '-' << std::setw(2) << std::setfill('0') + << (Poco::Thread::current() ? Poco::Thread::current()->id() : 0) << ' ' + << std::setw(2) << hours << ':' << std::setw(2) << minutes << ':' + << std::setw(2) << seconds << "." << std::setw(6) << usec + << ' '; + + char buf[32]; // we really need only 16 + if (prctl(PR_GET_NAME, reinterpret_cast<unsigned long>(buf), 0, 0, 0) == 0) + stream << '[' << std::setw(15) << std::setfill(' ') << std::left << buf << "] "; + + return stream.str(); + } + + void initialize(const std::string& name) + { + Source.name = name; + std::ostringstream oss; + oss << Source.name << '-' + << std::setw(5) << std::setfill('0') << Poco::Process::id(); + Source.id = oss.str(); + assert (sizeof (LogPrefix) > strlen(oss.str().c_str()) + 1); + strncpy(LogPrefix, oss.str().c_str(), sizeof(LogPrefix)); + + auto channel = (isatty(fileno(stdout)) || std::getenv("LOOL_LOGCOLOR") + ? static_cast<Poco::Channel*>(new Poco::ColorConsoleChannel()) + : static_cast<Poco::Channel*>(new Poco::ConsoleChannel())); + auto& logger = Poco::Logger::create(Source.name, channel, Poco::Message::PRIO_TRACE); + channel->release(); + + // Configure the logger. + // TODO: This should come from a file. + // See Poco::Logger::setLevel docs for values. + // Try: error, information, debug + char *loglevel = std::getenv("LOOL_LOGLEVEL"); + if (loglevel) + logger.setLevel(std::string(loglevel)); + + info("Initializing " + name); + info("Log level is [" + std::to_string(logger.getLevel()) + "]."); + } + + Poco::Logger& logger() + { + return Poco::Logger::get(Source.inited ? Source.name : std::string()); + } + + void trace(const std::string& msg) + { + logger().trace(prefix() + msg); + } + + void debug(const std::string& msg) + { + logger().debug(prefix() + msg); + } + + void info(const std::string& msg) + { + logger().information(prefix() + msg); + } + + void warn(const std::string& msg) + { + logger().warning(prefix() + msg); + } + + void error(const std::string& msg) + { + logger().error(prefix() + msg); + } + + void syserror(const std::string& msg) + { + logger().error(prefix() + msg + " (errno: " + std::string(std::strerror(errno)) + ")"); + } +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/Log.hpp b/loolwsd/Log.hpp new file mode 100644 index 0000000..b64f766 --- /dev/null +++ b/loolwsd/Log.hpp @@ -0,0 +1,121 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * 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/. + */ + +#ifndef INCLUDED_LOG_HPP +#define INCLUDED_LOG_HPP + +#include <string> +#include <sstream> +#include <functional> + +#include <Poco/Logger.h> + +namespace Log +{ + void initialize(const std::string& name); + Poco::Logger& logger(); + std::string prefix(); + + void trace(const std::string& msg); + void debug(const std::string& msg); + void info(const std::string& msg); + void warn(const std::string& msg); + void error(const std::string& msg); + void syserror(const std::string& msg); + + /// The following is to write streaming logs. + /// Log::info() << "Value: 0x" << std::hex << value + /// << ", pointer: " << this << Log::end; + static const struct _end_marker + { + _end_marker() + { + } + } end; + + class StreamLogger + { + public: + StreamLogger(std::function<void(const std::string&)> func) + : _func(func) + { + } + + StreamLogger(StreamLogger&& sl) + : _stream(std::move(sl._stream.str())) + , _func(std::move(sl._func)) + { + } + + void flush() const + { + _func(_stream.str()); + } + + std::ostringstream _stream; + + private: + std::function<void(const std::string&)> _func; + }; + + inline + StreamLogger trace() + { + return StreamLogger([](const std::string& msg) { trace(msg);}); + } + + inline + StreamLogger debug() + { + return StreamLogger([](const std::string& msg) { debug(msg);}); + } + + inline + StreamLogger info() + { + return StreamLogger([](const std::string& msg) { info(msg);}); + } + + inline + StreamLogger warn() + { + return StreamLogger([](const std::string& msg) { warn(msg);}); + } + + inline + StreamLogger error() + { + return StreamLogger([](const std::string& msg) { error(msg);}); + } + + template <typename U> + StreamLogger& operator <<(StreamLogger& lhs, const U& rhs) + { + lhs._stream << rhs; + return lhs; + } + + template <typename U> + StreamLogger& operator <<(StreamLogger&& lhs, U&& rhs) + { + lhs._stream << rhs; + return lhs; + } + + inline + void operator <<(StreamLogger& lhs, const _end_marker&) + { + (void)end; + lhs.flush(); + } +} + +#endif + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/loolwsd/Makefile.am b/loolwsd/Makefile.am index d5feb3a..b11426b 100644 --- a/loolwsd/Makefile.am +++ b/loolwsd/Makefile.am @@ -27,15 +27,16 @@ AM_ETAGSFLAGS = --c++-kinds=+p --fields=+iaS --extra=+q -R --totals=yes * AM_CTAGSFLAGS = $(AM_ETAGSFLAGS) shared_sources = ChildProcessSession.cpp \ - IoUtil.cpp \ + IoUtil.cpp \ + Log.cpp \ LOOLProtocol.cpp \ LOOLSession.cpp \ MessageQueue.cpp \ - Unit.cpp \ + Unit.cpp \ Util.cpp loolwsd_SOURCES = Admin.cpp \ - AdminModel.cpp \ + AdminModel.cpp \ Auth.cpp \ DocumentBroker.cpp \ LOOLWSD.cpp \ @@ -49,20 +50,23 @@ noinst_PROGRAMS = connect \ lokitclient loadtest_SOURCES = LoadTest.cpp \ + Log.cpp \ LOOLProtocol.cpp \ Util.cpp connect_SOURCES = Connect.cpp \ + Log.cpp \ LOOLProtocol.cpp \ Util.cpp lokitclient_SOURCES = IoUtil.cpp \ + Log.cpp \ LOKitClient.cpp \ LOOLProtocol.cpp \ Util.cpp loolforkit_SOURCES = LOOLForKit.cpp \ - LOOLKit.cpp \ + LOOLKit.cpp \ $(shared_sources) loolmount_SOURCES = loolmount.c @@ -80,8 +84,9 @@ noinst_HEADERS = Admin.hpp \ FileServer.hpp \ IoUtil.hpp \ LoadTest.hpp \ + Log.hpp \ LOKitHelper.hpp \ - LOOLKit.hpp \ + LOOLKit.hpp \ LOOLProtocol.hpp \ LOOLSession.hpp \ LOOLWSD.hpp \ @@ -92,8 +97,8 @@ noinst_HEADERS = Admin.hpp \ Rectangle.hpp \ Storage.hpp \ TileCache.hpp \ - Unit.hpp \ - UnitHTTP.hpp \ + Unit.hpp \ + UnitHTTP.hpp \ Util.hpp \ bundled/include/LibreOfficeKit/LibreOfficeKit.h \ bundled/include/LibreOfficeKit/LibreOfficeKitEnums.h \ diff --git a/loolwsd/Util.cpp b/loolwsd/Util.cpp index eaea899..32b9072 100644 --- a/loolwsd/Util.cpp +++ b/loolwsd/Util.cpp @@ -92,119 +92,6 @@ namespace rng } } -static char LogPrefix[256] = { '\0' }; - -namespace Log -{ - static const Poco::Int64 epochStart = Poco::Timestamp().epochMicroseconds(); - // help avoid destruction ordering issues. - struct StaticNames { - bool inited; - std::string name; - std::string id; - StaticNames() : - inited(true) - { - } - ~StaticNames() - { - inited = false; - } - }; - static StaticNames Source; - - std::string logPrefix() - { - Poco::Int64 usec = Poco::Timestamp().epochMicroseconds() - epochStart; - - const Poco::Int64 one_s = 1000000; - const Poco::Int64 hours = usec / (one_s*60*60); - usec %= (one_s*60*60); - const Poco::Int64 minutes = usec / (one_s*60); - usec %= (one_s*60); - const Poco::Int64 seconds = usec / (one_s); - usec %= (one_s); - - std::ostringstream stream; - stream << (Source.inited ? Source.id : std::string()) - << '-' << std::setw(2) << std::setfill('0') - << (Poco::Thread::current() ? Poco::Thread::current()->id() : 0) << ' ' - << std::setw(2) << hours << ':' << std::setw(2) << minutes << ':' - << std::setw(2) << seconds << "." << std::setw(6) << usec - << ' '; - - char buf[32]; // we really need only 16 - if (prctl(PR_GET_NAME, reinterpret_cast<unsigned long>(buf), 0, 0, 0) == 0) - stream << '[' << std::setw(15) << std::setfill(' ') << std::left << buf << "] "; - - return stream.str(); - } - - void initialize(const std::string& name) - { - Source.name = name; - std::ostringstream oss; - oss << Source.name << '-' - << std::setw(5) << std::setfill('0') << Poco::Process::id(); - Source.id = oss.str(); - assert (sizeof (LogPrefix) > strlen(oss.str().c_str()) + 1); - strncpy(LogPrefix, oss.str().c_str(), sizeof(LogPrefix)); - - auto channel = (isatty(fileno(stdout)) || std::getenv("LOOL_LOGCOLOR") - ? static_cast<Poco::Channel*>(new Poco::ColorConsoleChannel()) - : static_cast<Poco::Channel*>(new Poco::ConsoleChannel())); - auto& logger = Poco::Logger::create(Source.name, channel, Poco::Message::PRIO_TRACE); - channel->release(); - - // Configure the logger. - // TODO: This should come from a file. - // See Poco::Logger::setLevel docs for values. - // Try: error, information, debug - char *loglevel = std::getenv("LOOL_LOGLEVEL"); - if (loglevel) - logger.setLevel(std::string(loglevel)); - - info("Initializing " + name); - info("Log level is [" + std::to_string(logger.getLevel()) + "]."); - } - - Poco::Logger& logger() - { - return Poco::Logger::get(Source.inited ? Source.name : std::string()); - } - - void trace(const std::string& msg) - { - logger().trace(logPrefix() + msg); - } - - void debug(const std::string& msg) - { - logger().debug(logPrefix() + msg); - } - - void info(const std::string& msg) - { - logger().information(logPrefix() + msg); - } - - void warn(const std::string& msg) - { - logger().warning(logPrefix() + msg); - } - - void error(const std::string& msg) - { - logger().error(logPrefix() + msg); - } - - void syserror(const std::string& msg) - { - logger().error(logPrefix() + msg + " (errno: " + std::string(std::strerror(errno)) + ")"); - - } -} - namespace Util { std::string encodeId(const unsigned number, const int padding) @@ -391,7 +278,7 @@ namespace Util { TerminationFlag = true; - log_signal(LogPrefix); + log_signal(Log::prefix().c_str()); log_signal(" Termination signal received: "); log_signal(signalName(signal)); log_signal("\n"); @@ -417,7 +304,7 @@ namespace Util static void handleFatalSignal(const int signal) { - log_signal(LogPrefix); + log_signal(Log::prefix().c_str()); log_signal(" Fatal signal received: "); log_signal(signalName(signal)); log_signal("\n"); diff --git a/loolwsd/Util.hpp b/loolwsd/Util.hpp index 109a78a..46b973b 100644 --- a/loolwsd/Util.hpp +++ b/loolwsd/Util.hpp @@ -19,11 +19,12 @@ #include <Poco/Path.h> #include <Poco/Process.h> #include <Poco/Net/WebSocket.h> -#include <Poco/Logger.h> #define LOK_USE_UNSTABLE_API #include <LibreOfficeKit/LibreOfficeKitEnums.h> +#include "Log.hpp" + /// Flag to stop pump loops. extern volatile bool TerminationFlag; @@ -115,106 +116,6 @@ namespace Util bool hasCorrectUID(); }; -//TODO: Move to own file. -namespace Log -{ - void initialize(const std::string& name); - Poco::Logger& logger(); - - void trace(const std::string& msg); - void debug(const std::string& msg); - void info(const std::string& msg); - void warn(const std::string& msg); - void error(const std::string& msg); - void syserror(const std::string& msg); - - /// The following is to write streaming logs. - /// Log::info() << "Value: 0x" << std::hex << value - /// << ", pointer: " << this << Log::end; - static const struct _end_marker - { - _end_marker() - { - } - } end; - - class StreamLogger - { - public: - StreamLogger(std::function<void(const std::string&)> func) - : _func(func) - { - } - - StreamLogger(StreamLogger&& sl) - : _stream(std::move(sl._stream.str())) - , _func(std::move(sl._func)) - { - } - - void flush() const - { - _func(_stream.str()); - } - - std::ostringstream _stream; - - private: - std::function<void(const std::string&)> _func; - }; - - inline - StreamLogger trace() - { - return StreamLogger([](const std::string& msg) { trace(msg);}); - } - - inline - StreamLogger debug() - { - return StreamLogger([](const std::string& msg) { debug(msg);}); - } - - inline - StreamLogger info() - { - return StreamLogger([](const std::string& msg) { info(msg);}); - } - - inline - StreamLogger warn() - { - return StreamLogger([](const std::string& msg) { warn(msg);}); - } - - inline - StreamLogger error() - { - return StreamLogger([](const std::string& msg) { error(msg);}); - } - - template <typename U> - StreamLogger& operator <<(StreamLogger& lhs, const U& rhs) - { - lhs._stream << rhs; - return lhs; - } - - template <typename U> - StreamLogger& operator <<(StreamLogger&& lhs, U&& rhs) - { - lhs._stream << rhs; - return lhs; - } - - inline - void operator <<(StreamLogger& lhs, const _end_marker&) - { - (void)end; - lhs.flush(); - } -} - #endif /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits