11#pragma warning(disable: 4127)
50Categories::Categories(QObject* parent) :
54 const QString category =
"FilesReporting";
67 this, SLOT(configureFileChanged(QString)));
70Categories::~Categories()
75void Categories::configureFileChanged(
const QString & path )
77 if (QFile(path).exists())
86 const QString local_zone(
"FilesReporting");
87 static LogInit logInit(local_zone.toUtf8().constData());
88 auto& logger = *(logInit.
pLogger);
93 QFileInfo fileInfo(fileName);
94 QDir configDir = fileInfo.dir();
96 if (!file.open(QIODevice::ReadOnly))
98 std::cerr <<
"Unable to open qslog configuration file: \"" << fileName.toUtf8().data() <<
"\"" << std::endl;
104 LDEBUG <<
"Categories::configure configuration file: \"" << fileName <<
"\" already configured";
112 QTextStream in(&file);
113 auto line = in.readLine();
114 while (!line.isNull())
116 if (!line.startsWith(
"#"))
118 auto elts = line.split(
"=");
119 if (elts.size()==2 && elts.at(0).trimmed().startsWith(
"log4j.category."))
121 auto category = elts.at(0).trimmed().remove(0, QLatin1String(
"log4j.category.").size());
122 auto value = elts.at(1).trimmed();
126 LDEBUG << fileName <<
"overwrites category definition"
127 << category <<
"from"
131 if (value ==
"TRACE")
133 else if (value ==
"DEBUG")
135 else if (value ==
"INFO")
137 else if (value ==
"WARN")
139 else if (value ==
"ERROR")
141 else if (value ==
"FATAL")
145 std::cerr <<
"Error reading \"" << fileName.toUtf8().constData()
146 <<
"\": unknown level \"" << value.toUtf8().constData()
147 <<
"\". Using TRACE" << std::endl;
151 if(category == local_zone) {
155 logger.addDestination(destination);
159 logger.setLoggingLevel(lvl);
162 else if (elts.size()==2 && elts.at(0).trimmed() ==
"include")
164 auto includedFileName = elts.at(1).trimmed();
165 auto includedInitFileName = includedFileName;
166 if (!QFileInfo(includedInitFileName).isAbsolute())
168 includedInitFileName = configDir.filePath(includedInitFileName);
173 line = in.readLine();
175 LINFO <<
"QsLog conf file loaded:" << fileName;
186 std::cerr <<
"Error: unknown category. Using TRACE for \""
187 << category.toUtf8().constData() <<
"\"" << std::endl;
200 bool atLeastOneDestinationSuccessfulLoad =
false;
201 QStringList configDirsList;
202 if (configString.isEmpty())
213 while (! configDirsList.isEmpty() )
215 QString configDir = configDirsList.last();
216 configDirsList.pop_back();
217 QString initFileName = configDir +
"/log4cpp.properties";
218 if (QFileInfo::exists(initFileName))
222 atLeastOneDestinationSuccessfulLoad =
true;
241 QDir initDir( configDir +
"/log4cpp",
"*.properties",
242 QDir::Unsorted, QDir::Files);
243 if (initDir.exists())
245 QStringList entryList = initDir.entryList();
246 for(QString& entry : entryList)
250 atLeastOneDestinationSuccessfulLoad =
true;
274 std::cerr <<
"Exception during logging system configuration" << std::endl;
282 if (atLeastOneDestinationSuccessfulLoad)
#define LIMA_PATH_SEPARATOR
#define LIMA_COMMONQSLOG_EXPORT
LimaFileSystemWatcher extends QFileSystemWatcher to work on replaced files
void addPath(const QString &path)
QsLogging::Logger * pLogger
QMap< QString, Level > categories
QStringList m_configuredFiles
Store the list of configuration files already loaded.
QMap< QString, QString > m_categorySources
Association category name / file name. Allows to inform of overwrites.
LimaFileSystemWatcher m_configFileWatcher
static Categories & instance()
Level levelFor(const QString &category) const
bool configure(const QString &fileName, bool reload=false)
bool configure(const QString &fileName, bool reload=false)
const QMap< QString, DestinationPtr > & destinations() const
static Destinations & instance()
QStringList buildConfigurationDirectoriesList(const QStringList &projects, const QStringList &paths)
Build a list of configuration directories from a list of project names and a list of paths.
LIMA_COMMONQSLOG_EXPORT bool initQsLog(const QString &configString)