Changeset 48 for trunk


Ignore:
Timestamp:
05/28/13 21:29:34 (12 years ago)
Author:
epyon
Message:
  • coloring for logger
Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/logger.hh

    r4 r48  
    3737                virtual void log( log_level level, const std::string& message ) = 0;
    3838                /**
     39         * Optional timestamp string
     40                 */
     41                const char* timestamp() const;
     42                /**
    3943                 * Enforcement of virtual destructor.
    4044                 */
     
    122126        public:
    123127                /**
     128                 * Log sink constructor
     129                 */
     130                log_console_sink( bool coloring = true );
     131                /**
    124132                 * Logging function.
    125133                 */
    126134                virtual void log( log_level level, const std::string& message );
     135
     136        private:
     137                void* m_handle;
     138                bool  m_color;
    127139        };
    128140
  • trunk/src/logger.cc

    r4 r48  
    99#include <algorithm>
    1010#include <fstream>
     11#include <ctime>
     12#include <cstdio>
    1113#include <nv/exception.hh>
     14#if NV_PLATFORM == NV_WINDOWS
     15#define WIN32_LEAN_AND_MEAN
     16#include <Windows.h>
     17#endif
    1218
    1319using namespace nv;
     
    2935};
    3036
     37// log level names
     38const char *log_level_names_pad[] =
     39{
     40        "NONE    ",
     41        "FATAL   ",
     42        "CRITICAL",
     43        "ERROR   ",
     44        "WARNING ",
     45        "NOTICE  ",
     46        "INFO    ",
     47        "INFO    ",
     48        "DEBUG   ",
     49        "DEBUG2  ",
     50        "TRACE   "
     51};
     52
    3153// helper macro to access log_level_names
    3254#define NV_LOG_LEVEL_NAME(level) (log_level_names[ (level) / 10 ])
     55#define NV_LOG_LEVEL_NAME_PAD(level) (log_level_names_pad[ (level) / 10 ])
     56
     57#if NV_PLATFORM == NV_WINDOWS
     58unsigned short log_color[] =
     59{
     60        FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
     61        FOREGROUND_RED | FOREGROUND_INTENSITY,
     62        FOREGROUND_RED | FOREGROUND_INTENSITY,
     63        FOREGROUND_RED,
     64        FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY,
     65        FOREGROUND_GREEN | FOREGROUND_INTENSITY,
     66        FOREGROUND_GREEN,
     67        FOREGROUND_GREEN,
     68        FOREGROUND_INTENSITY,
     69        FOREGROUND_INTENSITY,
     70        FOREGROUND_INTENSITY
     71};
     72#else
     73const char *log_color[] =
     74{
     75        "\33[37;1m",
     76        "\33[31;1m",
     77        "\33[31;1m",
     78        "\33[31m",
     79        "\33[33;1m",
     80        "\33[32;1m",
     81        "\33[32m",
     82        "\33[32m",
     83        "\33[30;1m",
     84        "\33[30;1m",
     85        "\33[30;1m"
     86};
     87#endif
    3388
    3489// log function
     
    105160void log_console_sink::log( log_level level, const std::string& message )
    106161{
    107         std::cout << "[" << NV_LOG_LEVEL_NAME(level) << "] " << message << std::endl;
     162        if (m_color)
     163        {
     164#if NV_PLATFORM == NV_WINDOWS
     165                SetConsoleTextAttribute( m_handle, FOREGROUND_INTENSITY );
     166                std::cout << timestamp() << " [";
     167                SetConsoleTextAttribute( m_handle, log_color[ (level) / 10 ] );
     168                std::cout << NV_LOG_LEVEL_NAME_PAD(level);
     169                SetConsoleTextAttribute( m_handle, FOREGROUND_INTENSITY );
     170                std::cout << "] ";
     171                SetConsoleTextAttribute( m_handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE );
     172                std::cout << message << std::endl;
     173#else
     174                std::cout << "\33[30;1m" << timestamp() << " [" << log_color[ (level) / 10 ] << NV_LOG_LEVEL_NAME_PAD(level) << "\33[30;1m] \33[37;1m" << message << std::endl;
     175#endif
     176        }
     177        else
     178        {
     179        std::cout << timestamp() << " [" << NV_LOG_LEVEL_NAME_PAD(level) << "] " << message << std::endl;
     180        }
    108181}
    109182
     
    115188        {
    116189                // write and flush using std::endl
    117                 *m_stream << "[" << NV_LOG_LEVEL_NAME(level) << "] " << message << std::endl;
     190                *m_stream << timestamp() << " [" << NV_LOG_LEVEL_NAME(level) << "] " << message << std::endl;
    118191        }
    119192        else
    120193        {
    121194                // write and end with "\n" (no flush)
    122                 *m_stream << "[" << NV_LOG_LEVEL_NAME(level) << "] " << message << "\n";
     195                *m_stream << timestamp() << " [" << NV_LOG_LEVEL_NAME(level) << "] " << message << "\n";
    123196        }
    124197}
     
    149222        delete m_stream;
    150223}
     224
     225nv::log_console_sink::log_console_sink( bool coloring )
     226        : m_color( coloring )
     227{
     228#if NV_PLATFORM == NV_WINDOWS
     229        m_handle = GetStdHandle( STD_OUTPUT_HANDLE );
     230#endif
     231}
     232
     233const char* nv::log_sink::timestamp() const
     234{
     235        std::clock_t time = std::clock();
     236        unsigned int secs = (unsigned int)(time / CLOCKS_PER_SEC);
     237        unsigned int mm   = (unsigned int)(time*100 / CLOCKS_PER_SEC) % 100;
     238        unsigned int h    = (unsigned int)(secs / (60*60));
     239        unsigned int m    = (unsigned int)(secs / 60) % 60;
     240        unsigned int s    = secs % 60;
     241        static char buffer[128];
     242#if NV_PLATFORM == NV_WINDOWS
     243        sprintf_s( buffer, 128, "%02d:%02d:%02d.%02d", h, m, s, mm );
     244#else
     245        sprintf( buffer, "%02d:%02d:%02d.%02d", h, m, s, mm );
     246#endif
     247        buffer[11] = '\0';
     248        return buffer;
     249}
Note: See TracChangeset for help on using the changeset viewer.