mirror of https://github.com/cutefishos/appmotor
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
214 lines
5.3 KiB
C++
214 lines
5.3 KiB
C++
/***************************************************************************
|
|
**
|
|
** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
|
** All rights reserved.
|
|
** Contact: Nokia Corporation (directui@nokia.com)
|
|
**
|
|
** This file is part of applauncherd
|
|
**
|
|
** If you have questions regarding the use of this file, please contact
|
|
** Nokia at directui@nokia.com.
|
|
**
|
|
** This library is free software; you can redistribute it and/or
|
|
** modify it under the terms of the GNU Lesser General Public
|
|
** License version 2.1 as published by the Free Software Foundation
|
|
** and appearing in the file LICENSE.LGPL included in the packaging
|
|
** of this file.
|
|
**
|
|
****************************************************************************/
|
|
|
|
#include "logger.h"
|
|
#include <cstdlib>
|
|
#include <syslog.h>
|
|
#include <cstdarg>
|
|
#include <QDateTime>
|
|
#include <QDir>
|
|
#include <QString>
|
|
|
|
namespace {
|
|
const QString logDirectory("/var/log");
|
|
const QString logFileName(logDirectory + QDir::separator() + PROG_NAME_LAUNCHER + ".log");
|
|
const QString oldLogFileName(logFileName + ".old");
|
|
const QString dateFormat("yyyy-MM-dd hh:mm:ss.zzz");
|
|
}
|
|
|
|
bool Logger::m_isOpened = false;
|
|
QTextStream Logger::m_logStream;
|
|
QFile Logger::m_logFile;
|
|
bool Logger::m_useSyslog = false;
|
|
bool Logger::m_echoMode = false;
|
|
|
|
void Logger::openLog(const char * progName)
|
|
{
|
|
if (!Logger::m_isOpened)
|
|
{
|
|
// Check if it's possible to write under /var/log
|
|
// Should make it possible to get the logs in the enviroments
|
|
// with and without syslog.
|
|
QDir logDir;
|
|
if (logDir.exists(logDirectory)) {
|
|
// Directory exists, is it possible to create a file in it?
|
|
m_logFile.setFileName(oldLogFileName);
|
|
if (m_logFile.open(QIODevice::WriteOnly)) {
|
|
m_logFile.close();
|
|
m_logFile.remove();
|
|
}
|
|
else {
|
|
// It is not possible to write to file. Use syslog
|
|
m_useSyslog = true;
|
|
}
|
|
}
|
|
else {
|
|
// Directory does not exist. Is it possible to create it?
|
|
if (logDir.mkdir(logDirectory) == false) {
|
|
// Not possible to create directory. Use syslog.
|
|
m_useSyslog = true;
|
|
}
|
|
}
|
|
|
|
// Initialize the logging interface
|
|
if (m_useSyslog == false) {
|
|
// Remove the oldest log file
|
|
m_logFile.setFileName(oldLogFileName);
|
|
m_logFile.remove();
|
|
// Copy latest log file to .log.old
|
|
m_logFile.setFileName(logFileName);
|
|
m_logFile.rename(oldLogFileName);
|
|
// Open current log file
|
|
m_logFile.setFileName(logFileName);
|
|
|
|
if (m_logFile.open(QIODevice::WriteOnly)) {
|
|
Logger::m_logStream.setDevice(&m_logFile);
|
|
}
|
|
else {
|
|
m_useSyslog = true;
|
|
}
|
|
}
|
|
|
|
if (m_useSyslog) {
|
|
openlog(progName, LOG_PID, LOG_DAEMON);
|
|
}
|
|
|
|
Logger::m_isOpened = true;
|
|
}
|
|
}
|
|
|
|
void Logger::closeLog()
|
|
{
|
|
if (Logger::m_isOpened) {
|
|
if (m_useSyslog) {
|
|
closelog();
|
|
}
|
|
else {
|
|
m_logFile.close();
|
|
}
|
|
Logger::m_isOpened = false;
|
|
}
|
|
}
|
|
|
|
void Logger::writeLog(const int priority, const char * format, va_list ap)
|
|
{
|
|
if (Logger::m_isOpened) {
|
|
if (m_echoMode) {
|
|
vprintf(format, ap);
|
|
printf("\n");
|
|
}
|
|
|
|
if (m_useSyslog) {
|
|
vsyslog(priority, format, ap);
|
|
}
|
|
else {
|
|
QString msg;
|
|
msg.vsprintf(format, ap);
|
|
m_logStream <<
|
|
QDateTime::currentDateTime().toString(dateFormat);
|
|
|
|
switch (priority) {
|
|
case LOG_NOTICE:
|
|
m_logStream << " [NOTICE] ";
|
|
break;
|
|
case LOG_ERR:
|
|
m_logStream << " [ERROR] ";
|
|
break;
|
|
case LOG_WARNING:
|
|
m_logStream << " [WARNING] ";
|
|
break;
|
|
case LOG_INFO:
|
|
m_logStream << " [INFO] ";
|
|
break;
|
|
default:
|
|
m_logStream << " [N/A] ";
|
|
break;
|
|
}
|
|
|
|
m_logStream << msg << "\n";
|
|
m_logStream.flush();
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void Logger::logNotice(const char * format, ...)
|
|
{
|
|
#ifdef _DEBUG
|
|
|
|
va_list(ap);
|
|
va_start(ap, format);
|
|
writeLog(LOG_NOTICE, format, ap);
|
|
va_end(ap);
|
|
#else
|
|
Q_UNUSED(format);
|
|
#endif
|
|
}
|
|
|
|
void Logger::logWarning(const char * format, ...)
|
|
{
|
|
#ifdef _DEBUG
|
|
|
|
va_list(ap);
|
|
va_start(ap, format);
|
|
writeLog(LOG_WARNING, format, ap);
|
|
va_end(ap);
|
|
#else
|
|
Q_UNUSED(format);
|
|
#endif
|
|
}
|
|
|
|
void Logger::logInfo(const char * format, ...)
|
|
{
|
|
#ifdef _DEBUG
|
|
|
|
va_list(ap);
|
|
va_start(ap, format);
|
|
writeLog(LOG_INFO, format, ap);
|
|
va_end(ap);
|
|
#else
|
|
Q_UNUSED(format);
|
|
#endif
|
|
}
|
|
|
|
void Logger::logError(const char * format, ...)
|
|
{
|
|
va_list(ap);
|
|
va_start(ap, format);
|
|
writeLog(LOG_ERR, format, ap);
|
|
va_end(ap);
|
|
}
|
|
|
|
void Logger::logErrorAndDie(int code, const char * format, ...)
|
|
{
|
|
va_list(ap);
|
|
va_start(ap, format);
|
|
writeLog(LOG_ERR, format, ap);
|
|
vfprintf(stderr, format, ap);
|
|
va_end(ap);
|
|
|
|
exit(code);
|
|
}
|
|
|
|
void Logger::setEchoMode(bool enable)
|
|
{
|
|
Logger::m_echoMode = enable;
|
|
}
|
|
|