What is good practice for generating verbose output?

前端 未结 5 863
庸人自扰
庸人自扰 2021-02-19 03:49

what is good practice for generating verbose output? currently, i have a function

bool verbose;
int setVerbose(bool v)
{
    errormsg = \"\";
    verbose = v;
           


        
5条回答
  •  既然无缘
    2021-02-19 04:13

    The simplest way is to create small class as follows(here is Unicode version, but you can easily change it to single-byte version):

    #include 
    #include 
    #include 
    using namespace std;
    
    enum log_level_t {
        LOG_NOTHING,
        LOG_CRITICAL,
        LOG_ERROR,
        LOG_WARNING,
        LOG_INFO,
        LOG_DEBUG
    };
    
    namespace log_impl {
    class formatted_log_t {
    public:
        formatted_log_t( log_level_t level, const wchar_t* msg ) : fmt(msg), level(level) {}
        ~formatted_log_t() {
            // GLOBAL_LEVEL is a global variable and could be changed at runtime
            // Any customization could be here
            if ( level <= GLOBAL_LEVEL ) wcout << level << L" " << fmt << endl;
        }        
        template  
        formatted_log_t& operator %(T value) {
            fmt % value;
            return *this;
        }    
    protected:
        log_level_t     level;
        boost::wformat      fmt;
    };
    }//namespace log_impl
    // Helper function. Class formatted_log_t will not be used directly.
    template 
    log_impl::formatted_log_t log(const wchar_t* msg) {
        return log_impl::formatted_log_t( level, msg );
    }
    

    Helper function log was made template to get nice call syntax. Then it could be used in the following way:

    int main ()
    {
        // Log level is clearly separated from the log message
        log(L"TEST %3% %2% %1%") % 5 % 10 % L"privet";
        return 0;
    }
    

    You could change verbosity level at runtime by changing global GLOBAL_LEVEL variable.

提交回复
热议问题