Small logger class

后端 未结 9 1464
再見小時候
再見小時候 2020-12-12 17:24

I am looking for a small lightweight logging system in c++. I have found some existing frameworks but I don\'t need all of their features at this point in time. I primarily

9条回答
  •  自闭症患者
    2020-12-12 18:07

    For anyone wanting a simple solution, I recommend: easylogging++

    Single header only C++ logging library. It is extremely light-weight, robust, fast performing, thread and type safe and consists of many built-in features. It provides ability to write logs in your own customized format. It also provide support for logging your classes, third-party libraries, STL and third-party containers etc.

    This library has everything built-in to prevent usage of external libraries.

    Simple example: (more advanced examples available on the link above).

    #include "easylogging++.h"
    
    INITIALIZE_EASYLOGGINGPP
    
    int main(int argv, char* argc[]) {
       LOG(INFO) << "My first info log using default logger";
       return 0;
    }
    

    Example output inside a class:

    2015-08-28 10:38:45,900 DEBUG [default] [user@localhost] [Config::Config(const string)] [src/Config.cpp:7] Reading config file: 'config.json'

    I tried log4cpp and boost::log but they are not as easy as this one.

    EXTRA CONTENT: Minimal version - LOG header

    I created a small code for even simpler applications based on easylogging but requires no initialization (be aware that it is probably not thread safe). Here is the code:

    /* 
     * File:   Log.h
     * Author: Alberto Lepe 
     *
     * Created on December 1, 2015, 6:00 PM
     */
    
    #ifndef LOG_H
    #define LOG_H
    
    #include 
    
    using namespace std;
    
    enum typelog {
        DEBUG,
        INFO,
        WARN,
        ERROR
    };
    
    struct structlog {
        bool headers = false;
        typelog level = WARN;
    };
    
    extern structlog LOGCFG;
    
    class LOG {
    public:
        LOG() {}
        LOG(typelog type) {
            msglevel = type;
            if(LOGCFG.headers) {
                operator << ("["+getLabel(type)+"]");
            }
        }
        ~LOG() {
            if(opened) {
                cout << endl;
            }
            opened = false;
        }
        template
        LOG &operator<<(const T &msg) {
            if(msglevel >= LOGCFG.level) {
                cout << msg;
                opened = true;
            }
            return *this;
        }
    private:
        bool opened = false;
        typelog msglevel = DEBUG;
        inline string getLabel(typelog type) {
            string label;
            switch(type) {
                case DEBUG: label = "DEBUG"; break;
                case INFO:  label = "INFO "; break;
                case WARN:  label = "WARN "; break;
                case ERROR: label = "ERROR"; break;
            }
            return label;
        }
    };
    
    #endif  /* LOG_H */
    

    Usage:

    #include "Log.h"
    
    int main(int argc, char** argv) {
        //Config: -----(optional)----
        structlog LOGCFG = {};
        LOGCFG.headers = false; 
        LOGCFG.level = DEBUG;
        //---------------------------
        LOG(INFO) << "Main executed with " << (argc - 1) << " arguments";
    }
    

    This code print the message using "cout", but you can change it to use "cerr" or append a file, etc. I hope its useful to someone. (Note: I'm not C++ expert in any way, so this code may explode in extreme cases).

提交回复
热议问题