3 * @brief logger module implementation class.
5 * L7VSD: Linux Virtual Server for Layer7 Load Balancing
6 * Copyright (C) 2009 NTT COMWARE Corporation.
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
23 **********************************************************************/
30 #include <log4cxx/logger.h>
31 #include <log4cxx/level.h>
32 #include <log4cxx/net/syslogappender.h>
33 #include <log4cxx/fileappender.h>
34 #include <log4cxx/rollingfileappender.h>
35 #include <log4cxx/patternlayout.h>
36 #include <boost/format.hpp>
37 #include <boost/tr1/unordered_map.hpp>
38 #include <boost/foreach.hpp>
39 #include "logger_enum.h"
40 #include "logger_rotation_enum.h"
41 #include "appender_property.h"
43 #if !defined(LOGGER_PROCESS_VSD) && !defined(LOGGER_PROCESS_ADM) && !defined(LOGGER_PROCESS_SNM)
44 #define LOGGER_PROCESS_VSD
47 #if defined(LOGGER_PROCESS_VSD)
48 #define LOGGER_PROCESS_ID "VSD"
49 #elif defined(LOGGER_PROCESS_ADM)
50 #define LOGGER_PROCESS_ID "ADM"
52 #define LOGGER_PROCESS_ID "SNM"
55 #define LOGGER_PROCESS_PROTOCOL_MODULE_ID "PRM"
57 #define LOGGER_PROCESS_SCHEDULE_MODULE_ID "SCM"
59 #define LOGGER_NULL "/dev/null"
61 #define LOGGER_LEVEL_NUM (6)
65 typedef helpers::ObjectPtrT<RollingFileAppender> RollingFileAppenderPtr;
72 //! @brief Logger implement class.
73 //! @brief this class manage logger setting and logging by log4cxx.
77 //! typedef category <-> level map
78 typedef std::map< LOG_CATEGORY_TAG, LOG_LEVEL_TAG>
79 category_level_map_type;
80 //! typedef category <-> level map read only
81 typedef std::tr1::unordered_map< LOG_CATEGORY_TAG, LOG_LEVEL_TAG>
82 category_level_read_map_type;
83 //! typedef categoryname <-> CATEGORY_TAG map
84 typedef std::map< std::string, LOG_CATEGORY_TAG>
85 name_category_map_type;
86 //! typedef CATEGORY_TAG <-> categoryname map
87 typedef std::map< LOG_CATEGORY_TAG, std::string>
88 category_name_map_type;
90 //! returns current instance.
91 static LoggerImpl &getInstance();
93 //! initialze function
96 //! Configuration function
97 virtual void loadConf();
100 * retrieve category's log level.
102 * @param category that want to know
105 virtual inline LOG_LEVEL_TAG getLogLevel(LOG_CATEGORY_TAG cat) {
106 return category_level_read_map[cat];
110 * retrieve all category's log level.
112 * @param[out] category level list
114 virtual inline void getLogLevelAll(category_level_list_type &list) {
115 category_level_read_map.clear();
116 BOOST_FOREACH(category_level_map_type::value_type const & itr, category_level_map) {
117 category_level_read_map[itr.first] = itr.second;
118 list.push_back(std::make_pair(itr.first, itr.second));
123 * set category's log level.
125 * @param category to set log level
127 * @retval true succeed
128 * @retval false failed
130 virtual inline bool setLogLevel(LOG_CATEGORY_TAG cat, LOG_LEVEL_TAG level) {
131 category_level_map_type::iterator lv_itr = category_level_map.find(cat);
132 lv_itr->second = level;
134 category_level_read_map.clear();
135 BOOST_FOREACH(category_level_map_type::value_type const & itr, category_level_map) {
136 category_level_read_map[itr.first] = itr.second;
139 category_name_map_type::iterator categoryname_itr = category_name_map.find(cat);
142 log4cxx::Logger::getLogger(categoryname_itr->second)->setLevel(log4cxx::Level::toLevel(levelTable[level]));
143 } catch (const std::exception &ex) {
150 * set all category's log level.
152 * @param category to set log level
154 * @retval true succeed
155 * @retval false failed
157 virtual inline bool setLogLevelAll(LOG_LEVEL_TAG level) {
158 category_level_read_map.clear();
159 BOOST_FOREACH(category_level_map_type::value_type & itr, category_level_map) {
161 category_level_read_map[itr.first] = itr.second;
163 category_name_map_type::iterator categoryname_itr = category_name_map.find(itr.first);
165 log4cxx::Logger::getLogger(categoryname_itr->second)->setLevel(log4cxx::Level::toLevel(levelTable[level]));
166 } catch (const std::exception &ex) {
176 * @param category that logging matter occured
177 * @param log message id
179 * @param current file
180 * @param current line
183 virtual inline void putLogFatal(LOG_CATEGORY_TAG cat,
184 const unsigned int message_id,
185 const std::string &message,
188 std::stringstream buf;
192 case LOG_CAT_PROTOCOL:
194 buf << boost::format("%s%d%07d %s %s")
195 % LOGGER_PROCESS_PROTOCOL_MODULE_ID
202 case LOG_CAT_SCHEDULE:
204 buf << boost::format("%s%d%07d %s %s")
205 % LOGGER_PROCESS_SCHEDULE_MODULE_ID
214 buf << boost::format("%s%d%02d%05d %s %s")
225 category_name_map_type::iterator categoryname_itr = category_name_map.find(cat);
226 log4cxx::Logger::getLogger(categoryname_itr->second)->forcedLog(log4cxx::Level::getFatal(),
228 log4cxx::spi::LocationInfo(file, "", line));
230 if (snmpSendtrap && (LOG_CAT_L7VSD_SNMPBRIDGE != cat)) {
231 snmpSendtrap(buf.str());
233 } catch (const std::exception &ex) {
234 std::ostringstream oss;
235 oss << "Logging Error (Fatal Log) : " << ex.what();
236 errorConf(3, oss.str(), __FILE__, __LINE__);
242 * @param category that logging matter occured
243 * @param log message id
245 * @param current file
246 * @param current line
249 virtual inline void putLogError(LOG_CATEGORY_TAG cat,
250 const unsigned int message_id,
251 const std::string &message,
254 std::stringstream buf;
257 case LOG_CAT_PROTOCOL:
259 buf << boost::format("%s%d%07d %s %s")
260 % LOGGER_PROCESS_PROTOCOL_MODULE_ID
267 case LOG_CAT_SCHEDULE:
269 buf << boost::format("%s%d%07d %s %s")
270 % LOGGER_PROCESS_SCHEDULE_MODULE_ID
279 buf << boost::format("%s%d%02d%05d %s %s")
290 category_name_map_type::iterator categoryname_itr = category_name_map.find(cat);
291 log4cxx::Logger::getLogger(categoryname_itr->second)->forcedLog(log4cxx::Level::getError(),
293 log4cxx::spi::LocationInfo(file, "", line));
295 if (snmpSendtrap && (LOG_CAT_L7VSD_SNMPBRIDGE != cat)) {
296 snmpSendtrap(buf.str());
298 } catch (const std::exception &ex) {
299 std::ostringstream oss;
300 oss << "Logging Error (Error Log) : " << ex.what();
301 errorConf(4, oss.str(), __FILE__, __LINE__);
307 * @param category that logging matter occured
308 * @param log message id
310 * @param current file
311 * @param current line
314 virtual inline void putLogWarn(LOG_CATEGORY_TAG cat,
315 const unsigned int message_id,
316 const std::string &message,
319 std::stringstream buf;
322 case LOG_CAT_PROTOCOL:
324 buf << boost::format("%s%d%07d %s %s")
325 % LOGGER_PROCESS_PROTOCOL_MODULE_ID
332 case LOG_CAT_SCHEDULE:
334 buf << boost::format("%s%d%07d %s %s")
335 % LOGGER_PROCESS_SCHEDULE_MODULE_ID
344 buf << boost::format("%s%d%02d%05d %s %s")
355 category_name_map_type::iterator categoryname_itr = category_name_map.find(cat);
356 log4cxx::Logger::getLogger(categoryname_itr->second)->forcedLog(log4cxx::Level::getWarn(),
358 log4cxx::spi::LocationInfo(file, "", line));
359 } catch (const std::exception &ex) {
360 std::ostringstream oss;
361 oss << "Logging Error (Warn Log) : " << ex.what();
362 errorConf(5, oss.str(), __FILE__, __LINE__);
368 * @param category that logging matter occured
369 * @param log message id
371 * @param current file
372 * @param current line
375 virtual inline void putLogInfo(LOG_CATEGORY_TAG cat,
376 const unsigned int message_id,
377 const std::string &message,
380 std::stringstream buf;
383 case LOG_CAT_PROTOCOL:
385 buf << boost::format("%s%d%07d %s %s")
386 % LOGGER_PROCESS_PROTOCOL_MODULE_ID
393 case LOG_CAT_SCHEDULE:
395 buf << boost::format("%s%d%07d %s %s")
396 % LOGGER_PROCESS_SCHEDULE_MODULE_ID
405 buf << boost::format("%s%d%02d%05d %s %s")
416 category_name_map_type::iterator categoryname_itr = category_name_map.find(cat);
417 log4cxx::Logger::getLogger(categoryname_itr->second)->forcedLog(log4cxx::Level::getInfo(),
419 log4cxx::spi::LocationInfo(file, "", line));
420 } catch (const std::exception &ex) {
421 std::ostringstream oss;
422 oss << "Logging Error (Info Log) : " << ex.what();
423 errorConf(6, oss.str(), __FILE__, __LINE__);
429 * @param category that logging matter occured
430 * @param log message id
432 * @param current file
433 * @param current line
436 virtual inline void putLogDebug(LOG_CATEGORY_TAG cat,
437 const unsigned int message_id,
438 const std::string &message,
441 std::stringstream buf;
442 std::string logger_process_id = LOGGER_PROCESS_ID;
445 case LOG_CAT_PROTOCOL:
447 buf << boost::format("%s%d%07d %s %s")
448 % LOGGER_PROCESS_PROTOCOL_MODULE_ID
455 case LOG_CAT_SCHEDULE:
457 buf << boost::format("%s%d%07d %s %s")
458 % LOGGER_PROCESS_SCHEDULE_MODULE_ID
467 buf << boost::format("%s%d%02d%05d %s %s")
479 category_name_map_type::iterator categoryname_itr = category_name_map.find(cat);
480 log4cxx::Logger::getLogger(categoryname_itr->second)->forcedLog(log4cxx::Level::getDebug(),
481 buf.str(), log4cxx::spi::LocationInfo(file, "", line));
482 } catch (const std::exception &ex) {
483 std::ostringstream oss;
484 oss << "Logging Error (Debug Log) : " << ex.what();
485 errorConf(7, oss.str(), __FILE__, __LINE__);
490 * set snmp sendtrap function
492 * @param snmp send trap function object
495 void setSnmpSendtrap(const snmpSendtrapFuncType func) {
500 //! default constructor initialize member variables.
503 //! cpoy constructor disable
504 LoggerImpl(const LoggerImpl &);
506 //! operator= disable
507 LoggerImpl &operator=(const LoggerImpl &);
509 //! LOG_LEVEL_TAG to log4cxx::LevelPtr transrator
510 virtual inline const log4cxx::LevelPtr toLevel(LOG_LEVEL_TAG level) {
511 return log4cxx::Level::toLevel(levelTable[level]);
514 //! if error occured, switch appenders to syslogappender and fileappender(/dev/console)
515 virtual void errorConf(unsigned int messageId,
516 const std::string &errorMessage,
520 virtual void logic_error(const unsigned int, const std::string &, const char *, const unsigned int);
523 //! log4cxx::LevelPtr to LOG_LEVEL_TAG transrator
524 virtual inline LOG_LEVEL_TAG toLevelTag(const log4cxx::LevelPtr level){
525 int levelInt = level->toInt();
527 case log4cxx::Level::DEBUG_INT:
529 case log4cxx::Level::INFO_INT:
531 case log4cxx::Level::WARN_INT:
533 case log4cxx::Level::ERROR_INT:
535 case log4cxx::Level::FATAL_INT:
544 virtual ~LoggerImpl() {}
548 std::string hostname;
550 //log4cxx::Level* levelTable[LOGGER_LEVEL_NUM];
551 int levelTable[LOGGER_LEVEL_NUM];
553 //! category - loglevel hash map
554 category_level_map_type category_level_map;
555 category_level_read_map_type category_level_read_map;
556 //! category string -> logcateogry hash map
557 name_category_map_type name_category_map;
558 //! log_category -> category string hash map
559 category_name_map_type category_name_map;
561 appender_property normal_log_property;
562 appender_property access_log_property;
564 //! snmp trap function
565 snmpSendtrapFuncType snmpSendtrap;
570 #endif //__LOGGER_IMPL_H__