Skip to content

Commit 4bcddc1

Browse files
committedJun 10, 2011
[FEATURE] Added support for logging to a file. To enable it, set the QGIS_LOG_FILE environment variable to a writable file on your file system. When using the QGIS Mapserver, you can enable logging by adding a directive such as 'SetEnv QGIS_LOG_FILE /tmp/qgislog.txt' to the cgi-bin section of your apache config file.
1 parent 49e9286 commit 4bcddc1

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed
 

‎src/core/qgslogger.cpp

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
#include "qgslogger.h"
2020
#include <QtDebug>
21+
#include <QFile>
2122

2223
int QgsLogger::mDebugLevel = -999; // undefined value
2324

@@ -38,14 +39,17 @@ void QgsLogger::debug( const QString& msg, int debuglevel, const char* file, con
3839
if ( file == NULL )
3940
{
4041
qDebug( "%s", msg.toLocal8Bit().constData() );
42+
logMessageToFile( msg );
4143
}
4244
else if ( function == NULL )
4345
{
4446
qDebug( "%s: %s", file, msg.toLocal8Bit().constData() );
47+
logMessageToFile( msg );
4548
}
4649
else if ( line == -1 )
4750
{
4851
qDebug( "%s: (%s) %s", file, function, msg.toLocal8Bit().constData() );
52+
logMessageToFile( msg );
4953
}
5054
else
5155
{
@@ -54,6 +58,7 @@ void QgsLogger::debug( const QString& msg, int debuglevel, const char* file, con
5458
#else
5559
qDebug( "%s(%d) : (%s) %s", file, line, function, msg.toLocal8Bit().constData() );
5660
#endif
61+
logMessageToFile( msg );
5762
}
5863
}
5964
}
@@ -75,14 +80,17 @@ void QgsLogger::debug( const QString& var, int val, int debuglevel, const char*
7580
if ( file == NULL )
7681
{
7782
qDebug( "%s: %d", var.toLocal8Bit().constData(), val );
83+
logMessageToFile( QString( "%s: %d" ).arg( var.toLocal8Bit().constData() ).arg( val ) );
7884
}
7985
else if ( function == NULL )
8086
{
8187
qDebug( "%s: %s: %d", file, var.toLocal8Bit().constData(), val );
88+
logMessageToFile( QString( "%s: %s: %d" ).arg( file ).arg( var.toLocal8Bit().constData() ).arg( val ) );
8289
}
8390
else if ( line == -1 )
8491
{
8592
qDebug( "%s: (%s): %s: %d", file, function, var.toLocal8Bit().constData(), val );
93+
logMessageToFile( QString( "%s: (%s): %s: %d" ).arg( file ).arg( function ).arg( var.toLocal8Bit().constData() ).arg( val ) );
8694
}
8795
else
8896
{
@@ -91,6 +99,7 @@ void QgsLogger::debug( const QString& var, int val, int debuglevel, const char*
9199
#else
92100
qDebug( "%s: %d: (%s), %s: %d", file, line, function, var.toLocal8Bit().constData(), val );
93101
#endif
102+
logMessageToFile( QString( "%s: %d: (%s), %s: %d" ).arg( file ).arg( line ).arg( function ).arg( var.toLocal8Bit().constData() ).arg( val ) );
94103
}
95104
}
96105
}
@@ -112,14 +121,17 @@ void QgsLogger::debug( const QString& var, double val, int debuglevel, const cha
112121
if ( file == NULL )
113122
{
114123
qDebug( "%s: %f", var.toLocal8Bit().constData(), val );
124+
logMessageToFile( QString( "%s: %f" ).arg( var.toLocal8Bit().constData() ).arg( val ) );
115125
}
116126
else if ( function == NULL )
117127
{
118128
qDebug( "%s: %s: %f", file, var.toLocal8Bit().constData(), val );
129+
logMessageToFile( QString( "%s: %s: %f" ).arg( file ).arg( var.toLocal8Bit().constData() ).arg( val ) );
119130
}
120131
else if ( line == -1 )
121132
{
122133
qDebug( "%s: (%s): %s: %f", file, function, var.toLocal8Bit().constData(), val );
134+
logMessageToFile( QString( "%s: (%s): %s: %f" ).arg( file ).arg( function ).arg( var.toLocal8Bit().constData() ).arg( val ) );
123135
}
124136
else
125137
{
@@ -128,23 +140,27 @@ void QgsLogger::debug( const QString& var, double val, int debuglevel, const cha
128140
#else
129141
qDebug( "%s: %d: (%s), %s: %f", file, line, function, var.toLocal8Bit().constData(), val );
130142
#endif
143+
logMessageToFile( QString( "%s: %d: (%s), %s: %f").arg( file ).arg( line ).arg( function ).arg( var.toLocal8Bit().constData() ).arg( val ) );
131144
}
132145
}
133146
}
134147

135148
void QgsLogger::warning( const QString& msg )
136149
{
137150
qWarning( "%s", msg.toLocal8Bit().constData() );
151+
logMessageToFile( msg );
138152
}
139153

140154
void QgsLogger::critical( const QString& msg )
141155
{
142156
qCritical( "%s", msg.toLocal8Bit().constData() );
157+
logMessageToFile( msg );
143158
}
144159

145160
void QgsLogger::fatal( const QString& msg )
146161
{
147162
qFatal( "%s", msg.toLocal8Bit().constData() );
163+
logMessageToFile( msg );
148164
}
149165

150166
int QgsLogger::debugLevel()
@@ -178,6 +194,26 @@ int QgsLogger::debugLevel()
178194
return mDebugLevel;
179195
}
180196

197+
const QString QgsLogger::logFile()
198+
{
199+
const QString logFile = getenv( "QGIS_LOG_FILE" );
200+
return logFile;
201+
}
202+
203+
const void QgsLogger::logMessageToFile( QString theMessage )
204+
{
205+
if ( ! logFile().isEmpty() )
206+
{
207+
//Maybe more efficient to keep the file open for the life of qgis...
208+
QFile file( logFile() );
209+
file.open(QIODevice::Append);
210+
file.write( theMessage.toStdString().c_str() );
211+
file.write( "\n" );
212+
file.close();
213+
}
214+
return;
215+
}
216+
181217
const char* QgsLogger::debugFile()
182218
{
183219
const char* dfile = getenv( "QGIS_DEBUG_FILE" );

‎src/core/qgslogger.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <iostream>
2222
#include <sstream>
2323
#include <QString>
24+
class QFile;
2425

2526
#ifdef QGISDEBUG
2627
#define QgsDebugMsg(str) QgsLogger::debug(QString(str), 1, __FILE__, __FUNCTION__, __LINE__)
@@ -45,6 +46,9 @@
4546
* QGIS_DEBUG_FILE may contain a file name. Only the messages from this file are
4647
* printed (provided they have the right debuglevel). If QGIS_DEBUG_FILE is not
4748
* set, messages from all files are printed
49+
*
50+
* QGIS_LOG_FILE may contain a file name. If set, all messages will be appended
51+
* to this file rather than to stdout.
4852
*/
4953

5054
class CORE_EXPORT QgsLogger
@@ -107,8 +111,15 @@ class CORE_EXPORT QgsLogger
107111
static int debugLevel();
108112

109113
private:
114+
/**Reads the environment variable QGIS_LOG_FILE. Returns NULL if the variable is not set,
115+
* otherwise returns a file name for writing log messages to.*/
116+
static const QString logFile();
110117

111-
/**Reads the environment variable QGIS_DEBUG_FILE. Returns NULL if the variable is not set*/
118+
/** Logs the message passed in to the logfile defined in QGIS_LOG_FILE if any. **/
119+
static const void logMessageToFile( QString theMessage );
120+
121+
/**Reads the environment variable QGIS_DEBUG_FILE. Returns NULL if the variable is not set.
122+
* If set, only messages from this source file will be sent to logs. */
112123
static const char* debugFile();
113124

114125
/** current debug level */

0 commit comments

Comments
 (0)
Please sign in to comment.