Skip to content

Commit 8707cf2

Browse files
committed
[FEATURE]: File log in server also if server executable is compiled in release mode
1 parent 1ed94d0 commit 8707cf2

File tree

5 files changed

+181
-34
lines changed

5 files changed

+181
-34
lines changed

src/mapserver/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ SET ( qgis_mapserv_SRCS
3939
qgshostedrdsbuilder.cpp
4040
qgsremotedatasourcebuilder.cpp
4141
qgssentdatasourcebuilder.cpp
42+
qgsserverlogger.cpp
4243
qgsmsutils.cpp
4344
qgswcsprojectparser.cpp
4445
qgswfsprojectparser.cpp
@@ -58,6 +59,7 @@ SET (qgis_mapserv_MOC_HDRS
5859
qgscapabilitiescache.h
5960
qgsconfigcache.h
6061
qgsmslayercache.h
62+
qgsserverlogger.h
6163
)
6264

6365
SET (qgis_mapserv_RCCS

src/mapserver/qgis_map_serv.cpp

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "qgsmapserviceexception.h"
3333
#include "qgspallabeling.h"
3434
#include "qgsnetworkaccessmanager.h"
35+
#include "qgsserverlogger.h"
3536

3637
#include <QDomDocument>
3738
#include <QNetworkDiskCache>
@@ -47,7 +48,7 @@
4748

4849
void dummyMessageHandler( QtMsgType type, const char *msg )
4950
{
50-
#ifdef QGSMSDEBUG
51+
#if 0 //def QGSMSDEBUG
5152
QString output;
5253

5354
switch ( type )
@@ -79,53 +80,61 @@ void dummyMessageHandler( QtMsgType type, const char *msg )
7980

8081
void printRequestInfos()
8182
{
82-
#ifdef QGSMSDEBUG
83-
//print out some infos about the request
84-
QgsDebugMsg( "************************new request**********************" );
85-
QgsDebugMsg( QDateTime::currentDateTime().toString( "yyyy-MM-dd hh:mm:ss" ) );
86-
83+
QgsMessageLog::logMessage( "********************new request***************", "Server", QgsMessageLog::INFO );
8784
if ( getenv( "REMOTE_ADDR" ) != NULL )
8885
{
89-
QgsDebugMsg( "remote ip: " + QString( getenv( "REMOTE_ADDR" ) ) );
86+
QgsMessageLog::logMessage( "remote ip: " + QString( getenv( "REMOTE_ADDR" ) ), "Server", QgsMessageLog::INFO );
9087
}
9188
if ( getenv( "REMOTE_HOST" ) != NULL )
9289
{
93-
QgsDebugMsg( "remote host: " + QString( getenv( "REMOTE_HOST" ) ) );
90+
QgsMessageLog::logMessage( "remote ip: " + QString( getenv( "REMOTE_ADDR" ) ), "Server", QgsMessageLog::INFO );
9491
}
9592
if ( getenv( "REMOTE_USER" ) != NULL )
9693
{
97-
QgsDebugMsg( "remote user: " + QString( getenv( "REMOTE_USER" ) ) );
94+
QgsMessageLog::logMessage( "remote user: " + QString( getenv( "REMOTE_USER" ) ), "Server", QgsMessageLog::INFO );
9895
}
9996
if ( getenv( "REMOTE_IDENT" ) != NULL )
10097
{
101-
QgsDebugMsg( "REMOTE_IDENT: " + QString( getenv( "REMOTE_IDENT" ) ) );
98+
QgsMessageLog::logMessage( "REMOTE_IDENT: " + QString( getenv( "REMOTE_IDENT" ) ), "Server", QgsMessageLog::INFO );
10299
}
103100
if ( getenv( "CONTENT_TYPE" ) != NULL )
104101
{
105-
QgsDebugMsg( "CONTENT_TYPE: " + QString( getenv( "CONTENT_TYPE" ) ) );
102+
QgsMessageLog::logMessage( "CONTENT_TYPE: " + QString( getenv( "CONTENT_TYPE" ) ), "Server", QgsMessageLog::INFO );
106103
}
107104
if ( getenv( "AUTH_TYPE" ) != NULL )
108105
{
109-
QgsDebugMsg( "AUTH_TYPE: " + QString( getenv( "AUTH_TYPE" ) ) );
106+
QgsMessageLog::logMessage( "AUTH_TYPE: " + QString( getenv( "AUTH_TYPE" ) ), "Server", QgsMessageLog::INFO );
110107
}
111108
if ( getenv( "HTTP_USER_AGENT" ) != NULL )
112109
{
113-
QgsDebugMsg( "HTTP_USER_AGENT: " + QString( getenv( "HTTP_USER_AGENT" ) ) );
110+
QgsMessageLog::logMessage( "HTTP_USER_AGENT: " + QString( getenv( "HTTP_USER_AGENT" ) ), "Server", QgsMessageLog::INFO );
114111
}
115112
if ( getenv( "HTTP_PROXY" ) != NULL )
116113
{
117-
QgsDebugMsg( "HTTP_PROXY: " + QString( getenv( "HTTP_PROXY" ) ) );
114+
QgsMessageLog::logMessage( "HTTP_PROXY: " + QString( getenv( "HTTP_PROXY" ) ), "Server", QgsMessageLog::INFO );
118115
}
119116
if ( getenv( "HTTPS_PROXY" ) != NULL )
120117
{
121-
QgsDebugMsg( "HTTPS_PROXY: " + QString( getenv( "HTTPS_PROXY" ) ) );
118+
QgsMessageLog::logMessage( "HTTPS_PROXY: " + QString( getenv( "HTTPS_PROXY" ) ), "Server", QgsMessageLog::INFO );
122119
}
123120
if ( getenv( "NO_PROXY" ) != NULL )
124121
{
125-
QgsDebugMsg( "NO_PROXY: " + QString( getenv( "NO_PROXY" ) ) );
122+
QgsMessageLog::logMessage( "NO_PROXY: " + QString( getenv( "NO_PROXY" ) ), "Server", QgsMessageLog::INFO );
123+
}
124+
}
125+
126+
void printRequestParameters( const QMap< QString, QString>& parameterMap, int logLevel )
127+
{
128+
if ( logLevel > 0 )
129+
{
130+
return;
126131
}
127132

128-
#endif //QGSMSDEBUG
133+
QMap< QString, QString>::const_iterator pIt = parameterMap.constBegin();
134+
for ( ; pIt != parameterMap.constEnd(); ++pIt )
135+
{
136+
QgsMessageLog::logMessage( pIt.key() + ":" + pIt.value(), "Server", QgsMessageLog::INFO );
137+
}
129138
}
130139

131140
QFileInfo defaultProjectFile()
@@ -287,21 +296,17 @@ int main( int argc, char * argv[] )
287296
QgsFontUtils::loadStandardTestFonts( QStringList() << "Roman" << "Bold" );
288297
#endif
289298

290-
QString logFile = QgsLogger::logFile();
299+
int logLevel = QgsServerLogger::instance()->logLevel();
300+
QTime time; //used for measuring request time if loglevel < 1
291301

292302
while ( fcgi_accept() >= 0 )
293303
{
294-
if ( !logFile.isEmpty() )
304+
if ( logLevel < 1 )
295305
{
296-
#ifdef Q_WS_WIN
297-
putenv( QString( "QGIS_LOG_FILE=%1" ).arg( logFile ).toLocal8Bit().constData() );
298-
#else
299-
setenv( "QGIS_LOG_FILE", logFile.toLocal8Bit().constData(), 1 );
300-
#endif
306+
time.start();
307+
printRequestInfos();
301308
}
302309

303-
printRequestInfos(); //print request infos if in debug mode
304-
305310
//Request handler
306311
QgsRequestHandler* theRequestHandler = createRequestHandler();
307312
QMap<QString, QString> parameterMap;
@@ -311,11 +316,12 @@ int main( int argc, char * argv[] )
311316
}
312317
catch ( QgsMapServiceException& e )
313318
{
314-
QgsDebugMsg( "An exception was thrown during input parsing" );
319+
QgsMessageLog::logMessage( "Parse input exception: " + e.message(), "Server", QgsMessageLog::CRITICAL );
315320
theRequestHandler->sendServiceException( e );
316321
continue;
317322
}
318323

324+
printRequestParameters( parameterMap, logLevel );
319325
QMap<QString, QString>::const_iterator paramIt;
320326

321327
//Config file path
@@ -326,6 +332,7 @@ int main( int argc, char * argv[] )
326332
paramIt = parameterMap.find( "SERVICE" );
327333
if ( paramIt == parameterMap.constEnd() )
328334
{
335+
QgsMessageLog::logMessage( "Exception: SERVICE parameter is missing", "Server", QgsMessageLog::CRITICAL );
329336
theRequestHandler->sendServiceException( QgsMapServiceException( "ServiceNotSpecified", "Service not specified. The SERVICE parameter is mandatory" ) );
330337
delete theRequestHandler;
331338
continue;
@@ -340,7 +347,8 @@ int main( int argc, char * argv[] )
340347
QgsWCSProjectParser* p = QgsConfigCache::instance()->wcsConfiguration( configFilePath );
341348
if ( !p )
342349
{
343-
//error handling
350+
theRequestHandler->sendServiceException( QgsMapServiceException( "Project file error", "Error reading the project file" ) );
351+
continue;
344352
}
345353
QgsWCSServer wcsServer( configFilePath, parameterMap, p, theRequestHandler );
346354
wcsServer.executeRequest();
@@ -350,7 +358,8 @@ int main( int argc, char * argv[] )
350358
QgsWFSProjectParser* p = QgsConfigCache::instance()->wfsConfiguration( configFilePath );
351359
if ( !p )
352360
{
353-
//error handling
361+
theRequestHandler->sendServiceException( QgsMapServiceException( "Project file error", "Error reading the project file" ) );
362+
continue;
354363
}
355364
QgsWFSServer wfsServer( configFilePath, parameterMap, p, theRequestHandler );
356365
wfsServer.executeRequest();
@@ -360,12 +369,18 @@ int main( int argc, char * argv[] )
360369
QgsWMSConfigParser* p = QgsConfigCache::instance()->wmsConfiguration( configFilePath, parameterMap );
361370
if ( !p )
362371
{
363-
//error handling
372+
theRequestHandler->sendServiceException( QgsMapServiceException( "WMS configuration error", "There was an error reading gthe project file or the SLD configuration" ) );
373+
continue;
364374
}
365375
//adminConfigParser->loadLabelSettings( theMapRenderer->labelingEngine() );
366376
QgsWMSServer wmsServer( configFilePath, parameterMap, p, theRequestHandler, theMapRenderer, &capabilitiesCache );
367377
wmsServer.executeRequest();
368378
}
379+
380+
if ( logLevel < 1 )
381+
{
382+
QgsMessageLog::logMessage( "Request finished in " + QString::number( time.elapsed() ) + " ms", "Server", QgsMessageLog::INFO );
383+
}
369384
}
370385

371386
delete theMapRenderer;

src/mapserver/qgsconfigcache.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
***************************************************************************/
1717

1818
#include "qgsconfigcache.h"
19+
#include "qgsmessagelog.h"
1920
#include "qgswcsprojectparser.h"
2021
#include "qgswfsprojectparser.h"
2122
#include "qgswmsprojectparser.h"
@@ -118,9 +119,15 @@ QDomDocument* QgsConfigCache::xmlDocument( const QString& filePath )
118119
{
119120
//first open file
120121
QFile configFile( filePath );
121-
if ( !configFile.exists() || !configFile.open( QIODevice::ReadOnly ) )
122+
if ( !configFile.exists() )
122123
{
123-
QgsDebugMsg( "File unreadable: " + filePath );
124+
QgsMessageLog::logMessage( "Error, configuration file '" + filePath + "' does not exist", "Server", QgsMessageLog::CRITICAL );
125+
return 0;
126+
}
127+
128+
if ( !configFile.open( QIODevice::ReadOnly ) )
129+
{
130+
QgsMessageLog::logMessage( "Error, cannot open configuration file '" + filePath + "'", "Server", QgsMessageLog::CRITICAL );
124131
return 0;
125132
}
126133

@@ -130,8 +137,8 @@ QDomDocument* QgsConfigCache::xmlDocument( const QString& filePath )
130137
int line, column;
131138
if ( !xmlDoc->setContent( &configFile, true, &errorMsg, &line, &column ) )
132139
{
133-
QgsDebugMsg( QString( "Parse error %1 at row %2, column %3 in %4 " )
134-
.arg( errorMsg ).arg( line ).arg( column ).arg( filePath ) );
140+
QgsMessageLog::logMessage( "Error parsing file '" + filePath +
141+
QString( "': parse error %1 at row %2, column %3" ).arg( errorMsg ).arg( line ).arg( column ), "Server", QgsMessageLog::CRITICAL );
135142
delete xmlDoc;
136143
return 0;
137144
}

src/mapserver/qgsserverlogger.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/***************************************************************************
2+
qgsserverlogger.cpp
3+
-------------------
4+
begin : May 5, 2014
5+
copyright : (C) 2014 by Marco Hugentobler
6+
email : marco dot hugentobler at sourcepole 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 "qgsserverlogger.h"
19+
#include <QCoreApplication>
20+
#include <QFile>
21+
#include <QTextStream>
22+
#include <QTime>
23+
24+
QgsServerLogger* QgsServerLogger::mInstance = 0;
25+
26+
QgsServerLogger* QgsServerLogger::instance()
27+
{
28+
if ( mInstance == 0 )
29+
{
30+
mInstance = new QgsServerLogger();
31+
}
32+
return mInstance;
33+
}
34+
35+
QgsServerLogger::QgsServerLogger(): mLogFile( 0 )
36+
{
37+
//logfile
38+
QString filePath = getenv( "QGIS_LOG_FILE" );
39+
mLogFile.setFileName( filePath );
40+
if ( mLogFile.open( QIODevice::Append ) )
41+
{
42+
mTextStream.setDevice( &mLogFile );
43+
}
44+
45+
//log level
46+
char* logLevelChar = getenv( "QGIS_LOG_LEVEL" );
47+
if ( logLevelChar )
48+
{
49+
mLogLevel = atoi( logLevelChar );
50+
}
51+
else
52+
{
53+
mLogLevel = 3;
54+
}
55+
56+
connect( QgsMessageLog::instance(), SIGNAL( messageReceived( QString, QString, QgsMessageLog::MessageLevel ) ), this,
57+
SLOT( logMessage( QString, QString, QgsMessageLog::MessageLevel ) ) );
58+
}
59+
60+
void QgsServerLogger::logMessage( QString message, QString tag, QgsMessageLog::MessageLevel level )
61+
{
62+
Q_UNUSED( tag );
63+
if ( !mLogFile.isOpen() || mLogLevel > level )
64+
{
65+
return;
66+
}
67+
68+
mTextStream << ( "[" + QString::number( qlonglong( QCoreApplication::applicationPid() ) ) + "]["
69+
+ QTime::currentTime().toString() + "] " + message + "\n" );
70+
mTextStream.flush();
71+
}

src/mapserver/qgsserverlogger.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/***************************************************************************
2+
qgsserverlogger.h
3+
-----------------
4+
begin : May 5, 2014
5+
copyright : (C) 2014 by Marco Hugentobler
6+
email : marco dot hugentobler at sourcepole 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+
#ifndef QGSSERVERLOGGER_H
19+
#define QGSSERVERLOGGER_H
20+
21+
#include "qgsmessagelog.h"
22+
23+
#include <QFile>
24+
#include <QObject>
25+
#include <QString>
26+
#include <QTextStream>
27+
28+
/**Writes message log into server logfile*/
29+
class QgsServerLogger: public QObject
30+
{
31+
Q_OBJECT
32+
public:
33+
static QgsServerLogger* instance();
34+
35+
int logLevel() const { return mLogLevel; }
36+
//QString logFile() const { return mLogFile; }
37+
38+
public slots:
39+
void logMessage( QString message, QString tag, QgsMessageLog::MessageLevel level );
40+
41+
protected:
42+
QgsServerLogger();
43+
44+
private:
45+
static QgsServerLogger* mInstance;
46+
47+
QFile mLogFile;
48+
QTextStream mTextStream;
49+
int mLogLevel;
50+
};
51+
52+
#endif // QGSSERVERLOGGER_H

0 commit comments

Comments
 (0)