20 #ifndef _ANCH_LOGGER_LOGGER_FACTORY_H_ 21 #define _ANCH_LOGGER_LOGGER_FACTORY_H_ 24 #ifndef _ANCH_LOGGER_CONFIG_FILE_ 25 #define _ANCH_LOGGER_CONFIG_FILE_ "anch-logger.conf" 26 #endif // _ANCH_LOGGER_CONFIG_FILE_ 34 #ifdef ANCH_BOOST_REGEX 35 #include <boost/regex.hpp> 40 #include "logger/levels.hpp" 41 #include "logger/loggerConfiguration.hpp" 42 #include "logger/logger.hpp" 43 #include "logger/writer.hpp" 44 #include "logger/threadSafeWriter.hpp" 45 #include "logger/lowPriorityWriter.hpp" 46 #include "resource/resource.hpp" 47 #include "singleton.hpp" 68 std::vector<LoggerConfiguration> _loggersConfig;
71 std::vector<anch::logger::Logger*> _loggers;
79 LoggerFactory(): _loggersConfig() {
83 std::map<std::string,anch::logger::Writer*> writers;
84 initializeWriters(writers, resource);
85 initializeLoggersConfiguration(writers, resource);
88 loadDefaultConfiguration();
98 virtual ~LoggerFactory() {
99 std::set<anch::logger::Writer*> writers;
100 for(
size_t i = 0 ; i < _loggersConfig.size() ; i++) {
101 const std::vector<anch::logger::Writer*>& confWriters = _loggersConfig[i].getWriters();
103 writers.insert(writer);
129 for(
size_t i = 0 ; i <
self._loggersConfig.size() ; i++) {
131 const std::string& confName = config.
getCategory();
133 if((loggerConfig != NULL
134 && loggerConfig->
getCategory().size() > confName.size())
135 || (confName.size() > loggerName.size()
136 && confName !=
"default")) {
142 if(loggerName.substr(0,confName.size()) == confName) {
143 loggerConfig = &config;
149 if(loggerConfig == NULL && confName ==
"default") {
150 loggerConfig = &config;
157 if(loggerConfig != NULL) {
161 self._loggers.push_back(logger);
180 const std::string& pattern) {
185 }
else if(threadSafe) {
205 const std::string& path,
206 const std::string& pattern,
207 unsigned int maxSize,
213 }
else if(threadSafe) {
227 void initializeWriters(std::map<std::string,anch::logger::Writer*>& writers,
229 std::map<std::string,unsigned int> sizeMap = std::map<std::string,unsigned int>({
234 #ifdef ANCH_BOOST_REGEX 235 const boost::regex sizeRegex = boost::regex(
"^([0-9]+)(K|M|G)?$");
237 const std::regex sizeRegex = std::regex(
"^([0-9]+)(K|M|G)?$");
241 bool globalThreadSafe =
true;
242 std::string paramValue;
244 globalThreadSafe = (paramValue ==
"1");
247 bool globalLowPriority =
false;
249 globalLowPriority = (paramValue ==
"1");
254 #ifdef ANCH_BOOST_REGEX 259 const std::map<std::string,anch::resource::Section>& config = resource.
getConfiguration();
260 for(
auto iter = config.cbegin() ; iter != config.cend() ; iter++) {
261 if(iter->first.substr(0,8) ==
"WRITER::") {
262 std::string writer = iter->first;
263 std::string name = writer.substr(8);
275 bool threadSafe = globalThreadSafe;
276 if(resource.
getParameter(paramValue,
"writer.thread.safe", writer)) {
277 threadSafe = (paramValue ==
"1");
280 bool lowPriority = globalLowPriority;
281 if(resource.
getParameter(paramValue,
"writer.low.priority", writer)) {
282 lowPriority = (paramValue ==
"1");
286 if(name ==
"console") {
287 writers[name] = createWriterInstance(threadSafe,
289 (std::ostream*)(&std::cout),
295 found = resource.
getParameter(path,
"writer.filepath", writer);
299 std::string maxSizeStr;
300 unsigned int maxSize = 0;
301 resource.
getParameter(maxSizeStr,
"writer.max.size", writer);
302 if(regex_search(maxSizeStr, match, sizeRegex)) {
303 const std::string multStr = std::string(match[2].first,
305 maxSize = std::stoi(std::string(match[1].first,
306 match[1].second).data());
308 maxSize *= sizeMap[multStr];
315 std::string maxIdxStr;
317 "writer.max.rotate.index",
320 maxIndex = std::stoi(maxIdxStr);
323 writers[name] = createWriterInstance(threadSafe,
341 void initializeLoggersConfiguration(
const std::map<std::string,anch::logger::Writer*>& writers,
343 #ifdef ANCH_BOOST_REGEX 344 boost::regex upperRegex = boost::regex(
"[a-z]");
347 std::regex upperRegex = std::regex(
"[a-z]");
350 std::string upperRep =
"[A-Z]";
352 const std::map<std::string,anch::resource::Section>& config = resource.
getConfiguration();
353 for(
auto iter = config.cbegin() ; iter != config.cend() ; iter++) {
354 if(iter->first.substr(0,10) ==
"CATEGORY::") {
355 std::string category = iter->first;
356 std::string name = iter->first.substr(10);
357 std::string writerStr;
364 std::vector<anch::logger::Writer*> loggerWriters;
365 size_t nextPos = writerStr.find(
',',pos);
366 while(nextPos != std::string::npos && nextPos != pos) {
367 const std::string writerName = writerStr.substr(pos,
369 auto iter = writers.find(writerName);
370 if(iter != writers.cend()) {
371 loggerWriters.push_back(iter->second);
374 nextPos = writerStr.find(
',',pos);
376 const std::string writerName = writerStr.substr(pos);
377 auto iter = writers.find(writerName);
378 if(iter != writers.cend()) {
379 loggerWriters.push_back(iter->second);
384 if(loggerWriters.empty()) {
385 std::cerr <<
"No writers has been found for " << name <<
": " 386 << writerStr << std::endl;
389 std::string levelLbl;
390 resource.
getParameter(levelLbl,
"logger.level", category);
391 std::transform(levelLbl.begin(),
398 std::cerr <<
"Invalid level: " << levelLbl << std::endl;
400 level = iterLvl->second;
415 void loadDefaultConfiguration() {
416 _loggersConfig.clear();
417 std::cerr <<
"Logger configuration file " << _ANCH_LOGGER_CONFIG_FILE_ <<
" has not been found or is not readable." << std::endl;
418 std::cerr <<
"Default configuration is loading." << std::endl;
419 std::cerr <<
"Everything will be logged in console." << std::endl;
421 std::vector<anch::logger::Writer*> loggerWriters;
422 loggerWriters.push_back(console);
423 loggerWriters.shrink_to_fit();
425 anch::logger::Level::TRACE,
435 #endif // _ANCH_LOGGER_LOGGER_FACTORY_H_ const std::map< const std::string, const Level > LABEL_LEVEL
Definition: levels.hpp:73
bool getParameter(std::string &value, const std::string ¶m, const std::string §ion="") const
Definition: resource.cpp:80
Definition: logger.hpp:47
const std::map< std::string, anch::resource::Section > & getConfiguration() const
Definition: resource.hpp:94
AnCH framework base namespace.
Definition: base64.hpp:28
static const Resource & getResource(const std::string &filePath)
Definition: resource.cpp:58
Definition: loggerConfiguration.hpp:37
Definition: resource.hpp:37
const anch::logger::Level & getLevel() const
Definition: loggerConfiguration.hpp:85
const std::vector< anch::logger::Writer * > & getWriters() const
Definition: loggerConfiguration.hpp:94
Definition: lowPriorityWriter.hpp:40
static LoggerFactory & getInstance()
Definition: singleton.hpp:42
Definition: threadSafeWriter.hpp:36
Level
Definition: levels.hpp:34
const std::string & getCategory() const
Definition: loggerConfiguration.hpp:76
static const anch::logger::Logger & getLogger(const std::string &loggerName)
Definition: loggerFactory.hpp:125
Definition: writer.hpp:37
Logger factory.
Definition: loggerFactory.hpp:62
Meyers' singleton implemtation.
Definition: singleton.hpp:35