alog.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. #include "alog.h"
  2. namespace ALog {
  3. /*!
  4. * \brief setLogFileName sets a log file name ("Log_<Date>_<Time>.txt")
  5. */
  6. void setLogFileName()
  7. {
  8. logFileName = QString(logFolderName + QLatin1String("/Log_%1_%2.txt")
  9. ).arg(QDate::currentDate().toString(QStringLiteral("yyyy_MM_dd")),
  10. QTime::currentTime().toString(QStringLiteral("hh_mm_ss")));
  11. }
  12. /*!
  13. * \brief Cleans up old logs and initializes logging by preparing and installing a QMessageHandler
  14. *
  15. */
  16. void deleteOldLogs()
  17. {
  18. if(!QDir(logFolderName).exists()) {
  19. QDir().mkdir(logFolderName);
  20. }
  21. QDir dir;
  22. dir.setSorting(QDir::Time | QDir::Reversed);
  23. dir.setPath(logFolderName);
  24. QFileInfoList logs_list = dir.entryInfoList();
  25. if (logs_list.size() <= numberOfLogs) {
  26. return;
  27. } else {
  28. for (int i = 0; i < (logs_list.size() - numberOfLogs); i++) {
  29. const QString path = logs_list.at(i).absoluteFilePath();
  30. QFile file(path);
  31. file.remove();
  32. }
  33. }
  34. }
  35. /*!
  36. * \brief initialise logging, clean up logfiles and install a QMessageHandler
  37. */
  38. bool init()
  39. {
  40. // Create folder for logfiles if it doesn't exist, move to AStandardPaths later
  41. if(!QDir(logFolderName).exists()) {
  42. QDir().mkdir(logFolderName);
  43. }
  44. deleteOldLogs();
  45. setLogFileName();
  46. QFile log_file((logFileName));
  47. if(log_file.open(QIODevice::WriteOnly | QIODevice::Append)) {
  48. qInstallMessageHandler(ALog::aMessageHandler);
  49. return true;
  50. } else {
  51. return false;
  52. }
  53. }
  54. /*!
  55. * \brief aMessageHandler Intercepts Messages and prints to console and log file
  56. *
  57. * \abstract The message handler is responsible for intercepting the output from
  58. * qDebug(), qInfo(), qWarning() and qCritical(), formatting them and printing them
  59. * to the standard console out and to a logfile using QTextStream. Debug messages are
  60. * not written to the log file.
  61. *
  62. */
  63. void aMessageHandler(QtMsgType type, const QMessageLogContext &context,
  64. const QString& msg)
  65. {
  66. const char *function = context.function ? context.function : "";
  67. //check file size and if needed create new log!
  68. {
  69. QFile outFileCheck(logFileName);
  70. int size = outFileCheck.size();
  71. if (size > sizeOfLogs) {
  72. deleteOldLogs();
  73. setLogFileName();
  74. }
  75. }
  76. // open the log file and prepare a textstream to write to it
  77. QFile log_file(logFileName);
  78. log_file.open(QIODevice::WriteOnly | QIODevice::Append);
  79. QTextStream log_stream(&log_file);
  80. switch (type) {
  81. case QtDebugMsg:
  82. QTextStream(stdout) << "\t\033\[31m" << function << DEB_HEADER << msg << "\033[m" << endl;
  83. break;
  84. case QtInfoMsg:
  85. log_stream << QTime::currentTime().toString(Qt::ISODate) << INFO_HEADER << msg << function << endl;
  86. QTextStream(stdout) << INFO_HEADER_CONSOLE << msg << endl;
  87. break;
  88. case QtWarningMsg:
  89. log_stream << QTime::currentTime().toString(Qt::ISODate) << WARN_HEADER << msg << function << endl;
  90. QTextStream(stdout) << WARN_HEADER_CONSOLE << msg << endl;
  91. break;
  92. case QtCriticalMsg:
  93. log_stream << QTime::currentTime().toString(Qt::ISODate) << CRIT_HEADER << msg << function << endl;
  94. QTextStream(stdout) << CRIT_HEADER_CONSOLE << msg << endl;
  95. break;
  96. default:
  97. log_stream << QTime::currentTime().toString(Qt::ISODate) << INFO_HEADER << msg << function << endl;
  98. QTextStream(stdout) << INFO_HEADER_CONSOLE << msg << endl;
  99. break;
  100. }
  101. }
  102. } // namespace ALog