summaryrefslogtreecommitdiff
path: root/daemon/daemon.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'daemon/daemon.cpp')
-rw-r--r--daemon/daemon.cpp75
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;