Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslogger.cpp - description 3 : : ------------------- 4 : : begin : April 2006 5 : : copyright : (C) 2006 by Marco Hugentobler 6 : : email : marco.hugentobler at karto dot baug dot ethz dot ch 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgslogger.h" 19 : : 20 : : #include <QApplication> 21 : : #include <QtDebug> 22 : : #include <QFile> 23 : : #include <QElapsedTimer> 24 : : #include <QThread> 25 : : 26 : : #ifndef CMAKE_SOURCE_DIR 27 : : #error CMAKE_SOURCE_DIR undefined 28 : : #endif // CMAKE_SOURCE_DIR 29 : : 30 : : int QgsLogger::sDebugLevel = -999; // undefined value 31 : : int QgsLogger::sPrefixLength = -1; 32 : 0 : Q_GLOBAL_STATIC( QString, sFileFilter ) 33 : 0 : Q_GLOBAL_STATIC( QString, sLogFile ) 34 : 0 : Q_GLOBAL_STATIC( QElapsedTimer, sTime ) 35 : : 36 : 0 : void QgsLogger::init() 37 : : { 38 : 0 : if ( sDebugLevel != -999 ) 39 : 0 : return; 40 : : 41 : 0 : sTime()->start(); 42 : : 43 : 0 : *sLogFile() = getenv( "QGIS_LOG_FILE" ) ? getenv( "QGIS_LOG_FILE" ) : ""; 44 : 0 : *sFileFilter() = getenv( "QGIS_DEBUG_FILE" ) ? getenv( "QGIS_DEBUG_FILE" ) : ""; 45 : 0 : sDebugLevel = getenv( "QGIS_DEBUG" ) ? atoi( getenv( "QGIS_DEBUG" ) ) : 46 : : #ifdef QGISDEBUG 47 : : 1 48 : : #else 49 : : 0 50 : : #endif 51 : : ; 52 : : 53 : 0 : sPrefixLength = sizeof( CMAKE_SOURCE_DIR ); 54 : 0 : if ( CMAKE_SOURCE_DIR[sPrefixLength - 1] == '/' ) 55 : 0 : sPrefixLength++; 56 : 0 : } 57 : : 58 : 0 : void QgsLogger::debug( const QString &msg, int debuglevel, const char *file, const char *function, int line ) 59 : : { 60 : 0 : init(); 61 : : 62 : 0 : if ( !file && !sFileFilter()->isEmpty() && !sFileFilter()->endsWith( file ) ) 63 : 0 : return; 64 : : 65 : 0 : if ( sDebugLevel == 0 || debuglevel > sDebugLevel ) 66 : 0 : return; 67 : : 68 : : 69 : 0 : QString m = msg; 70 : : 71 : 0 : if ( file ) 72 : : { 73 : 0 : if ( qApp && qApp->thread() != QThread::currentThread() ) 74 : : { 75 : 0 : m.prepend( QStringLiteral( "[thread:0x%1] " ).arg( reinterpret_cast< qint64 >( QThread::currentThread() ), 0, 16 ) ); 76 : 0 : } 77 : : 78 : 0 : m.prepend( QStringLiteral( "[%1ms] " ).arg( sTime()->elapsed() ) ); 79 : 0 : sTime()->restart(); 80 : : 81 : 0 : if ( function ) 82 : : { 83 : 0 : m.prepend( QStringLiteral( " (%1) " ).arg( function ) ); 84 : 0 : } 85 : : 86 : 0 : if ( line != -1 ) 87 : : { 88 : : #ifndef _MSC_VER 89 : 0 : m.prepend( QStringLiteral( ":%1 :" ).arg( line ) ); 90 : : #else 91 : : m.prepend( QString( "(%1) :" ).arg( line ) ); 92 : : #endif 93 : 0 : } 94 : : 95 : : #ifndef _MSC_VER 96 : 0 : m.prepend( file + ( file[0] == '/' ? sPrefixLength : 0 ) ); 97 : : #else 98 : : m.prepend( file ); 99 : : #endif 100 : 0 : } 101 : : 102 : 0 : if ( sLogFile()->isEmpty() ) 103 : : { 104 : 0 : qDebug( "%s", m.toUtf8().constData() ); 105 : 0 : } 106 : : else 107 : : { 108 : 0 : logMessageToFile( m ); 109 : : } 110 : 0 : } 111 : : 112 : 0 : void QgsLogger::debug( const QString &var, int val, int debuglevel, const char *file, const char *function, int line ) 113 : : { 114 : 0 : debug( QStringLiteral( "%1: %2" ).arg( var ).arg( val ), debuglevel, file, function, line ); 115 : 0 : } 116 : : 117 : 0 : void QgsLogger::debug( const QString &var, double val, int debuglevel, const char *file, const char *function, int line ) 118 : : { 119 : 0 : debug( QStringLiteral( "%1: %2" ).arg( var ).arg( val ), debuglevel, file, function, line ); 120 : 0 : } 121 : : 122 : 0 : void QgsLogger::warning( const QString &msg ) 123 : : { 124 : 0 : logMessageToFile( msg ); 125 : 0 : qWarning( "Logged warning: %s", msg.toLocal8Bit().constData() ); 126 : 0 : } 127 : : 128 : 0 : void QgsLogger::critical( const QString &msg ) 129 : : { 130 : 0 : logMessageToFile( msg ); 131 : 0 : qCritical( "Logged critical: %s", msg.toLocal8Bit().constData() ); 132 : 0 : } 133 : : 134 : 0 : void QgsLogger::fatal( const QString &msg ) 135 : : { 136 : 0 : logMessageToFile( msg ); 137 : 0 : qFatal( "Logged fatal: %s", msg.toLocal8Bit().constData() ); 138 : 0 : } 139 : : 140 : 0 : void QgsLogger::logMessageToFile( const QString &message ) 141 : : { 142 : 0 : if ( sLogFile()->isEmpty() ) 143 : 0 : return; 144 : : 145 : : //Maybe more efficient to keep the file open for the life of qgis... 146 : 0 : QFile file( *sLogFile() ); 147 : 0 : if ( !file.open( QIODevice::Append ) ) 148 : 0 : return; 149 : 0 : file.write( message.toLocal8Bit().constData() ); 150 : 0 : file.write( "\n" ); 151 : 0 : file.close(); 152 : 0 : } 153 : : 154 : 0 : QString QgsLogger::logFile() 155 : : { 156 : 0 : init(); 157 : 0 : return *sLogFile(); 158 : : }