controlpanel/src/logger/src/logger.cpp
author hgs
Tue, 24 Aug 2010 10:30:25 +0800
changeset 52 58cebe0861a8
parent 34 8844afdb7529
permissions -rw-r--r--
201033
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0""
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* Initial Contributors:
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
hgs
parents:
diff changeset
    11
*
hgs
parents:
diff changeset
    12
* Contributors:
hgs
parents:
diff changeset
    13
*
52
hgs
parents: 34
diff changeset
    14
* Description:  This class provide log functionality.
32
hgs
parents:
diff changeset
    15
*
hgs
parents:
diff changeset
    16
*/
hgs
parents:
diff changeset
    17
#include <logger.h>
hgs
parents:
diff changeset
    18
#include "logoutput.h"
hgs
parents:
diff changeset
    19
#include "logoutputimpl.h"
hgs
parents:
diff changeset
    20
#include <QtAlgorithms>
hgs
parents:
diff changeset
    21
#include <QHash>
hgs
parents:
diff changeset
    22
#include <QString>
hgs
parents:
diff changeset
    23
#include <QStringList>
hgs
parents:
diff changeset
    24
#include <QDateTime>
hgs
parents:
diff changeset
    25
#include <QSettings>
hgs
parents:
diff changeset
    26
#include <QFileInfo>
hgs
parents:
diff changeset
    27
#include "loglogger.h"
hgs
parents:
diff changeset
    28
#include "logoutputfactory.h"
hgs
parents:
diff changeset
    29
hgs
parents:
diff changeset
    30
typedef QHash<QString,Logger*> LoggerContainer;
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
Q_GLOBAL_STATIC(LoggerContainer,theLoggerList)
hgs
parents:
diff changeset
    33
hgs
parents:
diff changeset
    34
class InitLogLogger 
hgs
parents:
diff changeset
    35
{
hgs
parents:
diff changeset
    36
public:
hgs
parents:
diff changeset
    37
    InitLogLogger() {
hgs
parents:
diff changeset
    38
        LogOutput *output = new DebugLogOutput();
hgs
parents:
diff changeset
    39
        output->init();
hgs
parents:
diff changeset
    40
        Logger::instance(LOGLOGGER_NAME)->addLogOutput(output);
hgs
parents:
diff changeset
    41
    }
hgs
parents:
diff changeset
    42
} dummy_instance;
hgs
parents:
diff changeset
    43
hgs
parents:
diff changeset
    44
class LoggerPrivate 
hgs
parents:
diff changeset
    45
{
hgs
parents:
diff changeset
    46
public:
hgs
parents:
diff changeset
    47
    LoggerPrivate(const QString &name = QString())
hgs
parents:
diff changeset
    48
        : mName(name), 
hgs
parents:
diff changeset
    49
          mDateTimeFormat("hh:mm:ss:zzz"),
hgs
parents:
diff changeset
    50
          mLogDateTime(true),
hgs
parents:
diff changeset
    51
          mLogLoggerName(true)
hgs
parents:
diff changeset
    52
    {
hgs
parents:
diff changeset
    53
    }
hgs
parents:
diff changeset
    54
hgs
parents:
diff changeset
    55
    ~LoggerPrivate()
hgs
parents:
diff changeset
    56
    {
hgs
parents:
diff changeset
    57
        clearAllLogOutput();
hgs
parents:
diff changeset
    58
    }
hgs
parents:
diff changeset
    59
    
hgs
parents:
diff changeset
    60
    void clearAllLogOutput() 
hgs
parents:
diff changeset
    61
    {
hgs
parents:
diff changeset
    62
        qDeleteAll(mLogOutputs.begin(),mLogOutputs.end());
hgs
parents:
diff changeset
    63
        mLogOutputs.clear();
hgs
parents:
diff changeset
    64
    }
hgs
parents:
diff changeset
    65
hgs
parents:
diff changeset
    66
    QString mName;
hgs
parents:
diff changeset
    67
    QString mDateTimeFormat;
hgs
parents:
diff changeset
    68
    QList<LogOutput*> mLogOutputs;
hgs
parents:
diff changeset
    69
    bool mLogDateTime;
hgs
parents:
diff changeset
    70
    bool mLogLoggerName;
hgs
parents:
diff changeset
    71
};
hgs
parents:
diff changeset
    72
hgs
parents:
diff changeset
    73
Logger *Logger::instance(const QString &name)
hgs
parents:
diff changeset
    74
{
hgs
parents:
diff changeset
    75
    if (name.isEmpty()) {
hgs
parents:
diff changeset
    76
        LOGGER_LOG("Logger::instance() >> name is empty.");
hgs
parents:
diff changeset
    77
        return 0;
hgs
parents:
diff changeset
    78
    }
hgs
parents:
diff changeset
    79
hgs
parents:
diff changeset
    80
    QString nameLower(name);
hgs
parents:
diff changeset
    81
    nameLower.toLower();
hgs
parents:
diff changeset
    82
hgs
parents:
diff changeset
    83
    Logger *logger = theLoggerList()->value(nameLower);
hgs
parents:
diff changeset
    84
    if (!logger) {
hgs
parents:
diff changeset
    85
        logger = new Logger(nameLower);
hgs
parents:
diff changeset
    86
        theLoggerList()->insert(nameLower,logger);
hgs
parents:
diff changeset
    87
    }
hgs
parents:
diff changeset
    88
hgs
parents:
diff changeset
    89
    return logger;
hgs
parents:
diff changeset
    90
}
hgs
parents:
diff changeset
    91
hgs
parents:
diff changeset
    92
void Logger::closeAll()
hgs
parents:
diff changeset
    93
{
hgs
parents:
diff changeset
    94
    qDeleteAll(theLoggerList()->begin(),theLoggerList()->end());
hgs
parents:
diff changeset
    95
    theLoggerList()->clear();
hgs
parents:
diff changeset
    96
}
hgs
parents:
diff changeset
    97
hgs
parents:
diff changeset
    98
void Logger::close(const QString &name)
hgs
parents:
diff changeset
    99
{
hgs
parents:
diff changeset
   100
    QString nameLower(name);
hgs
parents:
diff changeset
   101
    nameLower.toLower();
hgs
parents:
diff changeset
   102
    delete theLoggerList()->take(nameLower);
hgs
parents:
diff changeset
   103
}
hgs
parents:
diff changeset
   104
hgs
parents:
diff changeset
   105
Logger::Logger(const QString &name /*= QString()*/,QObject *parent /*= 0*/) : QObject(parent),
hgs
parents:
diff changeset
   106
    d_ptr(new LoggerPrivate(name))
hgs
parents:
diff changeset
   107
{
hgs
parents:
diff changeset
   108
    
hgs
parents:
diff changeset
   109
}
hgs
parents:
diff changeset
   110
hgs
parents:
diff changeset
   111
Logger::~Logger()
hgs
parents:
diff changeset
   112
{
hgs
parents:
diff changeset
   113
    delete d_ptr;
hgs
parents:
diff changeset
   114
}
hgs
parents:
diff changeset
   115
hgs
parents:
diff changeset
   116
void Logger::log(const QString &log)
hgs
parents:
diff changeset
   117
{
hgs
parents:
diff changeset
   118
    if (d_ptr->mLogOutputs.isEmpty()) {
hgs
parents:
diff changeset
   119
        return;
hgs
parents:
diff changeset
   120
    }
hgs
parents:
diff changeset
   121
hgs
parents:
diff changeset
   122
    QString logStr;
hgs
parents:
diff changeset
   123
hgs
parents:
diff changeset
   124
    if (d_ptr->mLogDateTime) {
34
hgs
parents: 32
diff changeset
   125
        logStr += QDateTime::currentDateTime().toString(d_ptr->mDateTimeFormat) + ' ';
32
hgs
parents:
diff changeset
   126
    }
hgs
parents:
diff changeset
   127
    
hgs
parents:
diff changeset
   128
    if (d_ptr->mLogLoggerName) {
hgs
parents:
diff changeset
   129
        logStr += '[';
hgs
parents:
diff changeset
   130
        logStr += name();
hgs
parents:
diff changeset
   131
        logStr += "]:";
hgs
parents:
diff changeset
   132
    }
hgs
parents:
diff changeset
   133
hgs
parents:
diff changeset
   134
    logStr += log;
hgs
parents:
diff changeset
   135
    logStr += LINE_SEPERATOR;
hgs
parents:
diff changeset
   136
hgs
parents:
diff changeset
   137
    foreach(LogOutput *logOutput, d_ptr->mLogOutputs) {
hgs
parents:
diff changeset
   138
        logOutput->output(logStr);
hgs
parents:
diff changeset
   139
    }
hgs
parents:
diff changeset
   140
}
hgs
parents:
diff changeset
   141
hgs
parents:
diff changeset
   142
void Logger::configure(const QString &configFile,QSettings::Format format /*= QSettings::NativeFormat*/)
hgs
parents:
diff changeset
   143
{
hgs
parents:
diff changeset
   144
    if (QFileInfo(configFile).exists()) {
hgs
parents:
diff changeset
   145
        QSettings settings(configFile,format);
hgs
parents:
diff changeset
   146
        configure(settings);
hgs
parents:
diff changeset
   147
    }
hgs
parents:
diff changeset
   148
}
hgs
parents:
diff changeset
   149
hgs
parents:
diff changeset
   150
void Logger::configure(QSettings &settings)
hgs
parents:
diff changeset
   151
{
hgs
parents:
diff changeset
   152
    clearAllLogOutput();
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
    settings.beginGroup(name());
hgs
parents:
diff changeset
   155
    QString strOutput = settings.value(LOGGER_OUTPUT).toString();
hgs
parents:
diff changeset
   156
    d_ptr->mLogDateTime = settings.value(LOGGER_LOGDATETIME,true).toBool();
hgs
parents:
diff changeset
   157
    d_ptr->mLogLoggerName = settings.value(LOGGER_LOGLOGGERNAME,true).toBool();
hgs
parents:
diff changeset
   158
    QString strDateTimeFormat = settings.value(LOGGER_DATETIMEFORMAT).toString();
hgs
parents:
diff changeset
   159
    if (!strDateTimeFormat.isEmpty()) {
hgs
parents:
diff changeset
   160
        d_ptr->mDateTimeFormat = strDateTimeFormat;
hgs
parents:
diff changeset
   161
    }
hgs
parents:
diff changeset
   162
    settings.endGroup();
hgs
parents:
diff changeset
   163
hgs
parents:
diff changeset
   164
    QStringList outputNameList = strOutput.split(' ',QString::SkipEmptyParts);
hgs
parents:
diff changeset
   165
    foreach(const QString &outputName,outputNameList) {
hgs
parents:
diff changeset
   166
        LogOutput *output = LogOutputFactory::createLogOutput(outputName);
hgs
parents:
diff changeset
   167
        if (output) {
hgs
parents:
diff changeset
   168
            output->setParentLogger(this);
hgs
parents:
diff changeset
   169
            if (output->load(settings)) {
hgs
parents:
diff changeset
   170
                addLogOutput(output);
hgs
parents:
diff changeset
   171
            }
hgs
parents:
diff changeset
   172
            else {
hgs
parents:
diff changeset
   173
                delete output;
hgs
parents:
diff changeset
   174
            }
hgs
parents:
diff changeset
   175
        }
hgs
parents:
diff changeset
   176
    }
hgs
parents:
diff changeset
   177
}
hgs
parents:
diff changeset
   178
hgs
parents:
diff changeset
   179
bool Logger::addLogOutput(LogOutput *output)
hgs
parents:
diff changeset
   180
{
hgs
parents:
diff changeset
   181
    if (!output) {
hgs
parents:
diff changeset
   182
        LOGGER_LOG("Logger::addLogOutput >> output is NULL.");
hgs
parents:
diff changeset
   183
        return false;
hgs
parents:
diff changeset
   184
    }
hgs
parents:
diff changeset
   185
hgs
parents:
diff changeset
   186
    if ( d_ptr->mLogOutputs.indexOf(output) >= 0) {
hgs
parents:
diff changeset
   187
        LOGGER_LOG("Logger::addLogOutput >> output is already in list.");
hgs
parents:
diff changeset
   188
        return false;
hgs
parents:
diff changeset
   189
    }
hgs
parents:
diff changeset
   190
hgs
parents:
diff changeset
   191
    if (logOutput(output->name())) {
hgs
parents:
diff changeset
   192
        LOGGER_LOG( QString("Logger::addLogOutput >> output with the name <") + output->name() + "> is already in list.");
hgs
parents:
diff changeset
   193
    }
hgs
parents:
diff changeset
   194
hgs
parents:
diff changeset
   195
    output->setParentLogger(this);
hgs
parents:
diff changeset
   196
    d_ptr->mLogOutputs.append(output);
hgs
parents:
diff changeset
   197
hgs
parents:
diff changeset
   198
    return true;
hgs
parents:
diff changeset
   199
}
hgs
parents:
diff changeset
   200
hgs
parents:
diff changeset
   201
void Logger::removeLogOutput(LogOutput *output)
hgs
parents:
diff changeset
   202
{
hgs
parents:
diff changeset
   203
    d_ptr->mLogOutputs.removeAll(output);
hgs
parents:
diff changeset
   204
}
hgs
parents:
diff changeset
   205
hgs
parents:
diff changeset
   206
LogOutput *Logger::logOutput(const QString &name)
hgs
parents:
diff changeset
   207
{
hgs
parents:
diff changeset
   208
    foreach(LogOutput *output,d_ptr->mLogOutputs) {
hgs
parents:
diff changeset
   209
        if (output->name().compare(name,Qt::CaseInsensitive) == 0) {
hgs
parents:
diff changeset
   210
            return output;
hgs
parents:
diff changeset
   211
        }
hgs
parents:
diff changeset
   212
    }
hgs
parents:
diff changeset
   213
hgs
parents:
diff changeset
   214
    return 0;
hgs
parents:
diff changeset
   215
}
hgs
parents:
diff changeset
   216
hgs
parents:
diff changeset
   217
void Logger::clearAllLogOutput()
hgs
parents:
diff changeset
   218
{
hgs
parents:
diff changeset
   219
    d_ptr->clearAllLogOutput();
hgs
parents:
diff changeset
   220
}
hgs
parents:
diff changeset
   221
hgs
parents:
diff changeset
   222
QString Logger::name() const
hgs
parents:
diff changeset
   223
{
hgs
parents:
diff changeset
   224
    return d_ptr->mName;
hgs
parents:
diff changeset
   225
}
hgs
parents:
diff changeset
   226
hgs
parents:
diff changeset
   227
bool Logger::logDateTime() const
hgs
parents:
diff changeset
   228
{
hgs
parents:
diff changeset
   229
    return d_ptr->mLogDateTime;
hgs
parents:
diff changeset
   230
}
hgs
parents:
diff changeset
   231
hgs
parents:
diff changeset
   232
void Logger::setLogDateTime(bool on)
hgs
parents:
diff changeset
   233
{
hgs
parents:
diff changeset
   234
    d_ptr->mLogDateTime = on;
hgs
parents:
diff changeset
   235
}
hgs
parents:
diff changeset
   236
hgs
parents:
diff changeset
   237
bool Logger::logLoggerName() const
hgs
parents:
diff changeset
   238
{
hgs
parents:
diff changeset
   239
    return d_ptr->mLogLoggerName;
hgs
parents:
diff changeset
   240
}
hgs
parents:
diff changeset
   241
hgs
parents:
diff changeset
   242
void Logger::setLogLoggerName(bool on)
hgs
parents:
diff changeset
   243
{
hgs
parents:
diff changeset
   244
    d_ptr->mLogLoggerName = on;
hgs
parents:
diff changeset
   245
}
hgs
parents:
diff changeset
   246
hgs
parents:
diff changeset
   247
QString Logger::dateTimeFormat() const
hgs
parents:
diff changeset
   248
{
hgs
parents:
diff changeset
   249
    return d_ptr->mDateTimeFormat;
hgs
parents:
diff changeset
   250
}
hgs
parents:
diff changeset
   251
hgs
parents:
diff changeset
   252
void Logger::setDateTimeFormat(const QString &format)
hgs
parents:
diff changeset
   253
{
hgs
parents:
diff changeset
   254
    d_ptr->mDateTimeFormat = format;
hgs
parents:
diff changeset
   255
}