diff options
| author | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-11 23:31:28 +0200 |
|---|---|---|
| committer | Tomasz Sterna <tomek@xiaoka.com> | 2014-07-11 23:31:28 +0200 |
| commit | 6a8cdaf2f718fef8a826fd98241050a7d3cbfb3d (patch) | |
| tree | 46a5d8db858b45d633b72a74f8a7ce011ec3cbe9 /daemon/daemon.cpp | |
| parent | efb33d6494d88c27c8766553b6a963ddf2654458 (diff) | |
Use Log4Qt in daemon
Diffstat (limited to 'daemon/daemon.cpp')
| -rw-r--r-- | daemon/daemon.cpp | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/daemon/daemon.cpp b/daemon/daemon.cpp index ab61171..eba9afa 100644 --- a/daemon/daemon.cpp +++ b/daemon/daemon.cpp @@ -30,6 +30,17 @@ #include <signal.h> #include <QCoreApplication> +#include <QStandardPaths> +#include <QFile> +#include <QDir> +#include <QFileInfo> + +#include "LogManager" +#include "SystemlogAppender" +#include "FileAppender" +#include "helpers/factory.h" +#include "Appender" +#include "PropertyConfigurator" void signalhandler(int sig) { @@ -43,10 +54,74 @@ void signalhandler(int sig) } } +// For some reason exactly SystemLogAppender doesn't have a factory registered in log4qt, +// so in order for it to be instantiatable from .conf file (or even in general?) we declare factory +// right here and will register it in initLoggin() +Log4Qt::Appender *create_system_log_appender() { + return new Log4Qt::SystemLogAppender; +} + +void initLogging() +{ + // Should really be done in log4qt, but somehow it's missing these + Log4Qt::Factory::registerAppender("org.apache.log4j.SystemLogAppender", create_system_log_appender); + + // Sailfish OS-specific locations for the app settings files and app's own files + const QString logConfigFilePath(QStandardPaths::standardLocations(QStandardPaths::ConfigLocation).at(0) + + "pebble/log4qt.conf"); + const QString fallbackLogConfigPath("/usr/share/pebble/log4qt.conf"); + + const QString& usedConfigFile = QFile::exists(logConfigFilePath) ? logConfigFilePath : fallbackLogConfigPath; + Log4Qt::PropertyConfigurator::configure(usedConfigFile); + + // Uglyish hack for replacing $XDG_CACHE_HOME with the proper cache directory + // TODO: Implement replacing of $XDG_CACHE_HOME (and other vars?) with the proper values before configuring log4qt + + // Iterate all appenders attached to root logger and whenever a FileAppender (or its descender found), replace + // $XDG_CACHE_HOME with the proper folder name + QList<Log4Qt::Appender *> appenders = Log4Qt::LogManager::rootLogger()->appenders(); + QList<Log4Qt::Appender *>::iterator i; + QDir pathCreator; + for (i = appenders.begin(); i != appenders.end(); ++i) { + Log4Qt::FileAppender* fa = qobject_cast<Log4Qt::FileAppender*>(*i); + if(fa) { + QString filename = fa->file(); + + // As per March 2014 on emulator QStandardPaths::CacheLocation is /home/nemo/.cache + // while on device it is /home/nemo/.cache/app-name + // both things are fine, logging path will just be a little deeper on device + filename.replace("$XDG_CACHE_HOME", + QStandardPaths::standardLocations(QStandardPaths::CacheLocation).at(0) + ); + // make sure loggin dir exists + QFileInfo fi(filename); + if(!pathCreator.mkpath(fi.path())) { + Log4Qt::LogManager::rootLogger()->error("Failed to create dir for logging: %1", fi.path()); + } + + fa->setFile(filename); + fa->activateOptions(); + } + } + + // For capturing qDebug() and console.log() messages + // Note that console.log() might fail in Sailfish OS device builds. Not sure why, but it seems like + // console.log() exactly in Sailfish OS device release builds doesn't go through the same qDebug() channel + Log4Qt::LogManager::setHandleQtMessages(true); + + qDebug() << "Using following log config file: " << usedConfigFile; + + Log4Qt::Logger::logger(QLatin1String("Main Logger"))->info("Logging started"); +} + int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); + // Init logging should be called after app object creation as initLogging() will examine + // QCoreApplication for determining the .conf files locations + initLogging(); + watch::WatchConnector watch; DBusConnector dbus; VoiceCallManager voice; |
