Mercurial > public > ostc_companion
diff Utils/LogAppender.cpp @ 1:0b3630a29ad8
Initial version based on previous repository.
Project was ported to QT6 and in now cmake based.
| author | Ideenmodellierer <tiefenrauscher@web.de> |
|---|---|
| date | Thu, 27 Nov 2025 18:40:28 +0100 |
| parents | |
| children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Utils/LogAppender.cpp Thu Nov 27 18:40:28 2025 +0100 @@ -0,0 +1,114 @@ +////////////////////////////////////////////////////////////////////////////// +/// \file LogAppender.cpp +/// \brief Put Log message somewhere. +/// \author JD Gascuel. +/// \copyright (c) 2011-2016 JD Gascuel. All rights reserved. +/// $Id$ +////////////////////////////////////////////////////////////////////////////// +// +// BSD 2-Clause License: +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// +// 1. Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF +// THE POSSIBILITY OF SUCH DAMAGE. +// +////////////////////////////////////////////////////////////////////////////// + +#include "Utils/LogAppender.h" + +#include <QDateTime> +#include <QDir> +#include <QSettings> + +////////////////////////////////////////////////////////////////////////////// +/// List of all currently defined appenders +/// NOTE: Use singleton to avoid messing-up with DLL on windows. + +QList<LogAppender *>& LogAppender::list() +{ + static QList<LogAppender *> appenderList; + return appenderList; +} + +////////////////////////////////////////////////////////////////////////////// +// Add new instance to the list. +// TODO: Lock for threads-safe ? +LogAppender::LogAppender(int, char *[]) + : _minLevel(Log::LEVEL_INFO) +{ + //---- Manage list of all appenders. + list().push_back(this); +} + +////////////////////////////////////////////////////////////////////////////// +// Remove defunct instance from the list. +// TODO: Lock for threads-safe ? +LogAppender::~LogAppender() { + list().removeAll(this); +} + +void LogAppender::setMinLevel(Log::Level level) +{ + _minLevel = level; + if( level < Log::minLevel ) + Log::minLevel = level; +} + +void LogAppender::setFormat(const char *format) +{ + _format = format; +} + +QString LogAppender::format(const Log &log) const +{ + QString line = _format.isEmpty() + ? QString::fromUtf8(defaultFormat()) + : QString::fromUtf8(_format); + + line.replace("%d", QDate::currentDate().toString("yyyy/MM/dd").toLatin1()); + line.replace("%t", QTime::currentTime().toString("hh:mm:ss.zzz").toLatin1()); + line.replace("%o", (log.level == Log::LEVEL_TRACE ) ? "TRACE " : + (log.level == Log::LEVEL_DEBUG ) ? "DEBUG " : + (log.level == Log::LEVEL_INFO ) ? "INFO " : + (log.level == Log::LEVEL_WARNING) ? "WARNING" : + (log.level == Log::LEVEL_THROW ) ? "THROW " : + (log.level == Log::LEVEL_ERROR ) ? "ERROR " : "-------"); + line.replace("%l", QString::number(log.line).toLatin1()); + line.replace("%f", log.file); + line.replace("%F", log.file.section('/', -1)); + line.replace("%p", log.function); + line.replace("%m", log.message); + + return line; +} + +////////////////////////////////////////////////////////////////////////////// +// Send to all instanciated appenders. +// TODO: Lock for threads-safe ? +void LogAppender::all(const Log& log) +{ + foreach(LogAppender* i, list()) + { + if( log.level >= i->_minLevel ) + (*i)(log); + } +}
