source: cpp/common/loggers/loggers.h @ 659

Last change on this file since 659 was 511, checked in by Maciej Komosinski, 9 years ago

Improved handling of multiline messages by loggers

  • Property svn:eol-style set to native
File size: 3.5 KB
RevLine 
[286]1// This file is a part of Framsticks SDK.  http://www.framsticks.com/
2// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
3// See LICENSE.txt for details.
[109]4
[378]5#ifndef _COMMON_LOGGERS_H_
6#define _COMMON_LOGGERS_H_
[109]7
[375]8#include <common/log.h>
[109]9#include <common/threads.h>
[378]10#include <common/nonstd_stl.h>
[109]11
[375]12class LoggerBase;
[109]13
[375]14class LoggerManager
[109]15{
[375]16        friend class LoggerBase;
[378]17        vector<LoggerBase*> loggers;
18        void send(int position, const char *obj, const char *method, int level, const char *msg);
[336]19public:
[378]20        int find(LoggerBase *logger)
21        {
22                vector<LoggerBase*>::iterator it = std::find(loggers.begin(), loggers.end(), logger);
23                return it == loggers.end() ? -1 : std::distance(loggers.begin(), it);
24        }
25        int add(LoggerBase *logger);
[336]26        void remove(int i);
[378]27        void remove(LoggerBase *logger);
[336]28        void removeAll();
[378]29        void send(const char *obj, const char *method, int level, const char *msg)
[336]30        {
[378]31                send(loggers.size() - 1, obj, method, level, msg);
[336]32        }
[375]33        ~LoggerManager() { removeAll(); }
[109]34};
35
[375]36extern THREAD_LOCAL_DECL(LoggerManager, message_handler_manager_instance);
[109]37
38////////////////////////////////////////
39
[375]40class LoggerBase
[109]41{
[375]42        friend class LoggerManager;
[336]43protected:
[375]44        LoggerManager* manager;
[336]45        int options;
[109]46
[336]47public:
[109]48
[375]49        enum LoggerOptions
[336]50        {
[372]51                DontBlock = 1, CannotBeBlocked = 2, Enable = 4, Paused = 8
[336]52        };
[109]53
[375]54        void logPrintf(const char *o, const char *m, int w, const char *bl, ...);
[378]55        void send(const char *obj, const char *method, int level, const char *msg);
[109]56
[373]57        bool isEnabled() { return manager ? true : false; }
[336]58        void enable();
59        void disable();
60        bool isPaused() { return (options & Paused) != 0; }
61        void pause();
62        void resume();
[109]63
[375]64        LoggerBase(int opts = 0) :manager(NULL), options(opts)
[336]65        {
[372]66                if (options&Enable) enable();
[336]67        }
[375]68        virtual ~LoggerBase()
[336]69        {
70                disable();
71        }
[109]72
[511]73        virtual void handle(const char *obj, const char *method, int level, const char *msg); ///< implemented by loggers accepting multiline messages. if not implemented, the default handle() splits multiline text into single lines and calls handleSingleLine()
74        virtual void handleSingleLine(const char *obj, const char *method, int level, const char *msg) {}  ///< implemented by loggers expecting single line messages
[109]75};
76
77///////////////////////////////////////////
78
[375]79class LoggerToMemory : public LoggerBase
[109]80{
[336]81protected:
[378]82        int maxlevel, minleveltostore, errcount, warncount, infocount, storedcount;
83        string msgs;
[109]84
[336]85public:
[109]86
[378]87        void reset() { maxlevel = LOG_INFO - 1; errcount = warncount = infocount = storedcount = 0; msgs = ""; }
[109]88
[336]89        enum Options2
90        {
91                StoreFirstMessage = 16, StoreAllMessages = 32
92        };
[109]93
[452]94        int getErrorCount() const   { return errcount; }
95        int getWarningCount() const { return warncount; }
96        int getInfoCount() const    { return infocount; }
97        int getStoredCount() const  { return storedcount; }
98        int getErrorLevel() const   { return maxlevel; }
99        string getMessages() const  { return msgs; }
100        string getCountSummary() const; ///< return the standard "... error(s), ... warning(s), ... message(s)" text (or empty string if count==0)
[109]101
[375]102        LoggerToMemory(int opts = 0, int minimal_level_to_store = LOG_ERROR) :LoggerBase(opts), minleveltostore(minimal_level_to_store)
[336]103        {
104                reset();
105        }
[109]106
[378]107        void handle(const char *obj, const char *method, int level, const char *msg);
[109]108};
109
[375]110class RedirectingLogger : public LoggerBase
[109]111{
[375]112        LoggerManager *other_manager;
[109]113public:
[378]114        RedirectingLogger(LoggerManager *other_mgr, int opts = 0)
[375]115                :LoggerBase(opts), other_manager(other_mgr) {}
[109]116
[378]117        void handle(const char *obj, const char *method, int level, const char *msg)
[336]118        {
[378]119                other_manager->send(obj, method, level, msg);
[336]120        }
[109]121};
122
123#endif
Note: See TracBrowser for help on using the repository browser.