log.h
上传用户:ets1996
上传日期:2014-09-30
资源大小:353k
文件大小:12k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*_############################################################################
  2.   _## 
  3.   _##  log.h  
  4.   _##
  5.   _##  SNMP++v3.2.22
  6.   _##  -----------------------------------------------
  7.   _##  Copyright (c) 2001-2007 Jochen Katz, Frank Fock
  8.   _##
  9.   _##  This software is based on SNMP++2.6 from Hewlett Packard:
  10.   _##  
  11.   _##    Copyright (c) 1996
  12.   _##    Hewlett-Packard Company
  13.   _##  
  14.   _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  15.   _##  Permission to use, copy, modify, distribute and/or sell this software 
  16.   _##  and/or its documentation is hereby granted without fee. User agrees 
  17.   _##  to display the above copyright notice and this license notice in all 
  18.   _##  copies of the software and any documentation of the software. User 
  19.   _##  agrees to assume all liability for the use of the software; 
  20.   _##  Hewlett-Packard and Jochen Katz make no representations about the 
  21.   _##  suitability of this software for any purpose. It is provided 
  22.   _##  "AS-IS" without warranty of any kind, either express or implied. User 
  23.   _##  hereby grants a royalty-free license to any and all derivatives based
  24.   _##  upon this software code base. 
  25.   _##  
  26.   _##  Stuttgart, Germany, Wed May  2 23:22:30 CEST 2007 
  27.   _##  
  28.   _##########################################################################*/
  29. #ifndef _log_h_
  30. #define _log_h_
  31. #include <snmp_pp/config_snmp_pp.h>
  32. #include <snmp_pp/reentrant.h>
  33. #ifndef WIN32
  34. #include <sys/types.h>
  35. #endif
  36. #include <stdio.h>
  37. #include <string.h>
  38. #ifdef SNMP_PP_NAMESPACE
  39. namespace Snmp_pp {
  40. #endif
  41. // Log entry class
  42. #define ERROR_LOG 0x10
  43. #define WARNING_LOG 0x20
  44. #define EVENT_LOG 0x30
  45. #define INFO_LOG 0x40
  46. #define DEBUG_LOG 0x50
  47. #define USER_LOG 0x60
  48. #define LOG_TYPES       6
  49. #ifdef _NO_LOGGING
  50.  
  51. #define LOG_BEGIN(x)
  52. #define LOG(x)
  53. #define LOG_END
  54. #else
  55. #define LOG_BEGIN(x)
  56. {
  57. if (DefaultLog::log()->log_needed(x))
  58. {
  59. DefaultLog::log()->lock();
  60. DefaultLog::create_log_entry(x);
  61. #define LOG(x) *DefaultLog::log_entry() += x
  62. #define LOG_END
  63. *DefaultLog::log() += DefaultLog::log_entry();
  64. DefaultLog::delete_log_entry();
  65. DefaultLog::log()->unlock();
  66. }
  67. }
  68. #endif
  69. /*--------------------------- class LogEntry --------------------------*/
  70. /**
  71.  * The LogEntry class represents log entries. An instance of LogEntry can be
  72.  * added to a Log. Each LogEntry can be classified into the log classes
  73.  * ERROR_LOG, WARNING_LOG, EVENT_LOG, INFO_LOG, DEBUG_LOG and USER_LOG with up
  74.  * to 16 severity levels. A log entry consists of a descriptor string and
  75.  * optional several string or numeric values.
  76.  *
  77.  * The log class USER_LOG can be used for applications, it is not used
  78.  * within snmp++ and agent++.
  79.  *
  80.  * @see Log
  81.  * 
  82.  * @author Frank Fock
  83.  * @author Marty Janzen
  84.  * @version 3.5f
  85.  */
  86. class DLLOPT LogEntry {
  87. public:
  88. /**
  89.  * Constructor with log class and severity level
  90.  * 
  91.  * @param t - The type of the log entry. The type is composed 
  92.  *            by a logical OR of the log entry class with a level
  93.  *            of 0 up to 15. 
  94.  * @note A error log of level 0 will stop program execution!
  95.  */  
  96. LogEntry(unsigned char t) : type(t), count(0) {}
  97. /**
  98.  * Virtual destructor.
  99.  */  
  100. virtual ~LogEntry() {}
  101. /**
  102.  * Initialize a new log entry, showing timestamp, class, and level.
  103.  */ 
  104. virtual void init(void);
  105. /**
  106.  * Add a numeric value to the log entry.
  107.  *
  108.  * @param l - A numeric value.
  109.  */
  110. virtual LogEntry& operator+=(const long);
  111. /**
  112.  * Add a string value to the log entry.
  113.  *
  114.  * @param l - A numeric value.
  115.  */
  116. virtual LogEntry& operator+=(const char*);
  117. /**
  118.  * Get the contents of this log entry.
  119.          *
  120.  * @return Current contents of this log entry.
  121.  */ 
  122. virtual const char* get_value(void) const { return ""; }
  123. /**
  124.  * Get the class of this log entry.
  125.          *
  126.  * @return Log entry class.
  127.  */ 
  128. unsigned char get_class(void) const { return type & 0xF0; }
  129. /**
  130.  * Get the level of this log entry.
  131.          *
  132.  * @return Log entry level.
  133.  */ 
  134. unsigned char get_level(void) const { return type & 0x0F; }
  135. protected:
  136. /**
  137.  * Add a string to the log.
  138.  *
  139.  * @param s - A string value.
  140.  * @return TRUE if the value has been added and FALSE if the log
  141.  *         entry is full.
  142.  */
  143. virtual bool add_string(const char*) = 0;
  144. /**
  145.  * Add an integer to the log.
  146.  *
  147.  * @param s - An integer value.
  148.  * @return TRUE if the value has been added and FALSE if the log
  149.  *         entry is full.
  150.  */
  151. virtual bool add_integer(long);
  152. /**
  153.  * Add the current time to the log.
  154.  */
  155. virtual bool add_timestamp(void);
  156. protected:
  157. unsigned char   type;
  158. int count;
  159. };
  160. /*------------------------- class LogEntryImpl ------------------------*/
  161. #define MAX_LOG_SIZE 2550 // increased until debugprintf is not used!
  162. /**
  163.  * The LogEntryImpl class implements a log entry using a dynamically
  164.  * allocated, but fixed-size buffer.
  165.  * @see Log
  166.  * 
  167.  * @author Marty Janzen
  168.  * @version 3.5f
  169.  */
  170. class DLLOPT LogEntryImpl : public LogEntry {
  171. public:
  172. /**
  173.  * Constructor with log class and severity level
  174.  * 
  175.  * @param t - The type of the log entry. The type is composed 
  176.  *            by logical or the log entry class with a level
  177.  *            of 0 up to 15. 
  178.  * @note A error log of level 0 will stop program execution!
  179.  */  
  180. LogEntryImpl(unsigned char);
  181. /**
  182.  * Destructor.
  183.  */  
  184. ~LogEntryImpl();
  185. /**
  186.  * Get the contents of this log entry.
  187.          *
  188.  * @return Current contents of this log entry.
  189.  */ 
  190. virtual const char* get_value(void) const { return value; }
  191. protected:
  192. /**
  193.  * Count the bytes left for additional values.
  194.  *
  195.  * @return The number of bytes left in this log entry.
  196.  */  
  197. unsigned int bytes_left() 
  198.     { return (unsigned int)(MAX_LOG_SIZE-(ptr-value)-1); }
  199. /**
  200.  * Add a string to the log.
  201.  *
  202.  * @param s - A string value.
  203.  * @return TRUE if the value has been added and FALSE if the log
  204.  *         entry is full.
  205.  */
  206. bool add_string(const char*);
  207. private:
  208.         char* value;
  209. char* ptr;
  210. bool output_stopped;
  211. };
  212. /*--------------------------- class AgentLog --------------------------*/
  213. /**
  214.  * The AgentLog class is an abstract base class representing a log for
  215.  * information that is generated during the run time of an AGENT++
  216.  * SNMP agent.  A derived class only needs to provide appropriate
  217.  * create_log_entry() and operator+= methods.
  218.  * @see LogEntry
  219.  *
  220.  * @author Frank Fock
  221.  * @version 3.5.14
  222.  */
  223.  
  224. class DLLOPT AgentLog {
  225. public:
  226. /**
  227.  * Default constructor.
  228.  */ 
  229. AgentLog();
  230. /**
  231.  * Virtual destructor.
  232.  */
  233. virtual ~AgentLog() {}
  234. /**
  235.  * Lock the receiver.  Default action is to perform no locking.
  236.  */
  237. virtual void lock() {}
  238. /**
  239.  * Unlock the receiver.  Default action is to perform no locking.
  240.  */
  241. virtual void unlock() {}
  242. /**
  243.  * Set a filter on a specified log class. Only log entries with
  244.  * a level less or equal than the specified level will be logged.
  245.  *
  246.  * @param logclass - A log entry class. @see LogEntry
  247.  * @param filter - A value between 0 and 15.
  248.  */ 
  249. virtual void set_filter(int logclass, unsigned char filter);
  250. /**
  251.  * Gets the log level for the given log class.
  252.  * @return
  253.  *    a unsigned char value between 0 and 15 
  254.  */
  255. virtual unsigned char get_filter(int logclass) const; 
  256. /**
  257.  * Create a new LogEntry.
  258.  *
  259.  * @param t - The type of the log entry.
  260.  * @return A new instance of LogEntry (or of a derived class).
  261.  */
  262. virtual LogEntry* create_log_entry(unsigned char) const = 0;
  263. /**
  264.  * Add a LogEntry to the receiver Log.
  265.  *
  266.  * @param log - A log entry.
  267.  * @return The receiver log itself.
  268.  */
  269. virtual AgentLog& operator+=(const LogEntry*) = 0;
  270. /**
  271.  * Check whether a logging for the given type of LogEntry
  272.  * has to be done or not.
  273.  *
  274.  * @param type
  275.  *    the type of the log entry. The type is composed 
  276.  *    by logical or the log entry class with a level
  277.  *    of 0 up to 15.
  278.  * @return
  279.  *    TRUE if logging is needed, FALSE otherwise.
  280.  */
  281. virtual bool log_needed(unsigned char t) 
  282.   { return ((t & 0x0F) <= logfilter[(t / 16) - 1]); }
  283. /**
  284.  * Return the current time as a string.
  285.  * 
  286.  * @param
  287.  *    a buffer (of at least 18 characters, for the default method)
  288.          *    into which to place a string containg the current time.
  289.          *    If no buffer is supplied, a static area is used.
  290.  * @return
  291.  *    a string containing the current time. Either the supplied
  292.  *    buffer or the static area.
  293.  */
  294. virtual const char* now(char* = 0);
  295. /**
  296.  * Return the current time as a string, using the current
  297.          * default log object.  (For backward compatibility.)
  298.  * @note that the user is responsible for deleting the returned
  299.  * string, using delete [].
  300.  * 
  301.  * @return
  302.  *    a string containg the current time.
  303.  */
  304. static const char* get_current_time();
  305. protected:
  306. unsigned char logfilter[LOG_TYPES];
  307. char static_buf[18];
  308. };
  309. /*------------------------- class AgentLogImpl ------------------------*/
  310. /**
  311.  * The AgentLogImpl class is an implementation of AgentLog which writes
  312.  * log messages to a file, or to stdout or stderr.
  313.  * @see LogEntry 
  314.  *
  315.  * @author Frank Fock
  316.  * @version 3.5f
  317.  */
  318.  
  319. class DLLOPT AgentLogImpl : public AgentLog {
  320. public:
  321. /**
  322.  * Default constructor, with optional pointer to an open log file.
  323.          * Log is directed to the file if given, otherwise to stdout
  324.  *
  325.  * @param fp - An open log file.  0 implies stdout.
  326.  */ 
  327. AgentLogImpl(FILE* = stdout);
  328. /**
  329.  * Constructor with file name of a log file. Log is directed
  330.  * to the given file.
  331.  *
  332.  * @param fname - The file name of a log file.
  333.  */ 
  334. AgentLogImpl(const char*);
  335. /**
  336.  * Destructor.
  337.  */
  338. ~AgentLogImpl();
  339. /**
  340.  * Set destination of logs to a given file.
  341.  * 
  342.  * @param fname - A file name. "" directs logs to stdout.
  343.  */
  344. void set_dest(const char*);
  345. /**
  346.  * Set destination of logs to a given file.
  347.  * 
  348.  * @param fp - A pointer to an open file.  0 directs logs to stdout.
  349.  */
  350. void set_dest(FILE*);
  351. /**
  352.  * Lock the receiver.
  353.  */
  354. void lock()
  355. {
  356. #ifdef _THREADS
  357. logLock.lock();
  358. #endif
  359. }
  360. /**
  361.  * Unlock the receiver.
  362.  */
  363.  void unlock()
  364. {
  365. #ifdef _THREADS
  366. logLock.unlock();
  367. #endif
  368. }
  369. /**
  370.  * Create a new LogEntry.
  371.  *
  372.  * @param t - The type of the log entry.
  373.  * @return A new instance of LogEntry (or of a derived class).
  374.  */
  375. virtual LogEntry* create_log_entry(unsigned char) const;
  376. /**
  377.  * Add a LogEntry to the receiver Log.
  378.  *
  379.  * @param log - A log entry.
  380.  * @return The receiver log itself.
  381.  */
  382. virtual AgentLog& operator+=(const LogEntry*);
  383. protected:
  384. SnmpSynchronized logLock;
  385. FILE* logfile;
  386. bool close_needed;
  387. };
  388. /*--------------------------- class DefaultLog --------------------------*/
  389. /**
  390.  * The DefaultLog class has a static Log member, that is used by the
  391.  * AGENT++ API for logging.
  392.  *
  393.  * @version 3.5.4
  394.  * @author Frank Fock (singlton pattern -> Philippe Roger)
  395.  */  
  396. class DLLOPT DefaultLog {
  397. public:
  398. DefaultLog() { }
  399. ~DefaultLog() { }
  400. /** 
  401.  * Initialize the default logger with the given logging implementation.
  402.  *
  403.  * @param logger
  404.  *    an AgentLog instance to be used as default logger. A previously
  405.  *    set logger will be deleted.
  406.  */
  407. static void init(AgentLog* logger) 
  408.   { if (instance) delete instance; instance = logger; }
  409. /**
  410.  * Return the default logger. 
  411.  *
  412.  * @return
  413.  *    a pointer to an AgentLog instance.
  414.  */
  415. static AgentLog* log() 
  416.   { if (!instance) init(new AgentLogImpl()); return instance; }
  417. /**
  418.  * Create a new log entry or reuse an existing one.
  419.  *
  420.  * @param type
  421.  *    the type of the log entry as bitwise or of log class and level. 
  422.  */
  423. static void create_log_entry(unsigned char t)
  424.   { if (!entry) { entry = log()->create_log_entry(t); entry->init();} }
  425. /**
  426.  * Return the current log entry. If there is none, an ERROR_LOG entry
  427.  * with level 1 will be created.
  428.  *
  429.  * @return
  430.  *    a pointer to a LogEntry instance.
  431.  */
  432. static LogEntry* log_entry() 
  433.   { if (!entry) create_log_entry(ERROR_LOG | 1); return entry; } 
  434. /**
  435.  * Delete current log entry.
  436.  */
  437. static void delete_log_entry() 
  438.   { if (entry) delete entry; entry = 0; }
  439. protected:
  440. static AgentLog* instance;
  441. static LogEntry* entry;
  442. };
  443. #ifdef SNMP_PP_NAMESPACE
  444. }
  445. #endif
  446. #endif // _log_h_