⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 log.cpp

📁 JdonFramework need above jdk 1.4.0 This version has passed under Tomcat 4.x/5.x JBoss 3.x/JBoss 4.0
💻 CPP
字号:
/*_############################################################################  _##   _##  log.cpp    _##  _##  SNMP++v3.2.21a  _##  -----------------------------------------------  _##  Copyright (c) 2001-2006 Jochen Katz, Frank Fock  _##  _##  This software is based on SNMP++2.6 from Hewlett Packard:  _##    _##    Copyright (c) 1996  _##    Hewlett-Packard Company  _##    _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.  _##  Permission to use, copy, modify, distribute and/or sell this software   _##  and/or its documentation is hereby granted without fee. User agrees   _##  to display the above copyright notice and this license notice in all   _##  copies of the software and any documentation of the software. User   _##  agrees to assume all liability for the use of the software;   _##  Hewlett-Packard and Jochen Katz make no representations about the   _##  suitability of this software for any purpose. It is provided   _##  "AS-IS" without warranty of any kind, either express or implied. User   _##  hereby grants a royalty-free license to any and all derivatives based  _##  upon this software code base.   _##    _##  Stuttgart, Germany, Tue Nov 21 22:12:16 CET 2006   _##    _##########################################################################*/#ifndef WIN32#include <unistd.h>#else#include <process.h>#endif#include <stdio.h>#include <stdlib.h>#include <time.h>#include <signal.h>#include <string.h>#include <snmp_pp/log.h>#ifdef WIN32#ifdef __BCPLUSPLUS__#define _getpid getpid#endif#endif#if defined (CPU) && CPU == PPC603#include <taskLib.h>#endif#ifdef SNMP_PP_NAMESPACEusing namespace Snmp_pp;#endif// default log filter: logs with level less or equal filter value are logged// error, warning, event, info, debug:static unsigned char default_logfilter[] = { 9, 9, 4, 6, 7 };#undef   LOG_INDENT/*--------------------------- class LogEntry --------------------------*/ /**  * Initialize a log entry, showing timestamp, class, and level.  *   */  void LogEntry::init(void){#ifdef WIN32	int pid = _getpid();#elif defined (CPU) && CPU == PPC603	int pid = taskIdSelf();#else	int pid = getpid();#endif	add_timestamp();	add_string(": ");	add_integer(pid);	add_string(": ");	char buf[20];	sprintf(buf, "(%X)", get_level());	add_string(buf);	switch (type & 0xF0) {	case DEBUG_LOG:   add_string("DEBUG  : "); break;	case INFO_LOG:	  add_string("INFO   : "); break;	case WARNING_LOG: add_string("WARNING: "); break;	case ERROR_LOG:	  add_string("ERROR  : "); break;	case EVENT_LOG:	  add_string("EVENT  : "); break;	}#ifdef LOG_INDENT	// indent log by level	for (int i=0; i<(type & 0x0F); i++) 		add_string(" ");#endif}/** * Add a string value to the log entry. * * @param l - A numeric value. */LogEntry& LogEntry::operator+=(const char* s){	// The convention for Agent++ log messages is that the	// timestamp, etc. is followed by the class and method name,	// then by the list of arguments.	if (count == 0) 		add_string(s);	else {	  if (count == 1) 		add_string(": ");	  else 		add_string(", ");	  add_string("(");	  add_string(s);	  add_string(")");	}	count++;	return *this;}/** * Add a numeric value to the log entry. * * @param l - A numeric value. */LogEntry& LogEntry::operator+=(const long l){	if (count == 1) 		add_string(": ");	else 		add_string(", ");	count++;	add_string("(");	add_integer(l);	add_string(")");	return *this;}/** * Add an integer to the log. * * @param s - An integer value. * @return TRUE if the value has been added and FALSE if the log *         entry is full. */bool LogEntry::add_integer(long l){	char buf[40];	sprintf(buf, "%ld", l);	return add_string(buf);}/** * Add the current time to the log entry. */bool LogEntry::add_timestamp(void){	return add_string(DefaultLog::log()->now());}/*------------------------- class LogEntryImpl ------------------------*//** * Constructor for the standard log entry implementation. */  LogEntryImpl::LogEntryImpl(unsigned char t) : LogEntry(t){	value = new char[MAX_LOG_SIZE];        value[0] = '\0';	ptr = value;	output_stopped = FALSE;}/** * Destructor for the standard log entry implementation. */  LogEntryImpl::~LogEntryImpl(){	delete [] value;}/** * Add a string to the log. * * @param s - A string value. * @return TRUE if the value has been added and FALSE if the log *         entry is full. */bool LogEntryImpl::add_string(const char* s){	if (output_stopped)		return FALSE;	size_t len = strlen(s);	if (len <= bytes_left()) {		strcat(ptr, s);		ptr += len;		return TRUE;	}	if (bytes_left() >= 3) {		strcat(ptr, "...");		ptr += 3;	}	output_stopped = TRUE;	return FALSE;}	/*-------------------------- class AgentLog ---------------------------*//** * Default constructor. */AgentLog::AgentLog(){	for (int i=0; i<LOG_TYPES; i++)		logfilter[i] = default_logfilter[i];}void AgentLog::set_filter(int logclass, unsigned char filter){ 	int idx = (logclass/16)-1;	if ((idx >=0) && (idx <= LOG_TYPES) && (filter<16)) 		logfilter[idx] = filter; }unsigned char AgentLog::get_filter(int logclass) const{	int idx = (logclass/16)-1;		if ((idx >= 0) && (idx < LOG_TYPES)) { 		return logfilter[idx]; 	}	return 0;}const char* AgentLog::now(char* buf){        if (buf == NULL) buf = static_buf;	time_t t;	time(&t);	strftime(buf, 18, "%Y%m%d.%H:%M:%S", localtime(&t));	return buf;}	/*static*/ const char* AgentLog::get_current_time() {	char* buf = new char[18];        strcpy(buf, DefaultLog::log()->now());	return buf;}	/*------------------------ class AgentLogImpl -------------------------*//** * Default constructor. Log is directed to stdout. */AgentLogImpl::AgentLogImpl(FILE* fp) : AgentLog(){	set_dest(fp);}/** * Constructor with file name of a log file. Log is directed * to the given file. * * @param fname - The file name of a log file. */ AgentLogImpl::AgentLogImpl(const char* fname) : AgentLog(){	set_dest(fname);}/** * Destructor. */AgentLogImpl::~AgentLogImpl(){	if (close_needed) fclose(logfile);}/** * Set destination of logs to a given file. *  * @param fname - A file name. "" directs logs to stdout. */void AgentLogImpl::set_dest(const char* fname){	close_needed = FALSE;	if ((!fname) || (strlen(fname) == 0)) 		logfile = stdout;	else {		logfile = fopen(fname, "a");		if (logfile == NULL)			logfile = stdout;		else			close_needed = TRUE;	}}/** * Set destination of logs to a given file. *  * @param fname - A pointer to an open log file. 0 directs logs to stdout. */void AgentLogImpl::set_dest(FILE* fp){	logfile = fp ? fp : stdout;	close_needed = FALSE;}/** * Create a new LogEntry. * * @param t - The type of the log entry. * @return A new instance of LogEntry (or of a derived class). */LogEntry* AgentLogImpl::create_log_entry(unsigned char t) const{	return new LogEntryImpl(t);}/** * Add a LogEntry to the receiver Log. * * @param log - A log entry. * @return The receiver log itself. */AgentLog& AgentLogImpl::operator+=(const LogEntry* log){	fprintf(logfile, "%s\n", log->get_value());	// check if critical error	if ((log->get_class() == ERROR_LOG) && (log->get_level() == 0))		raise(SIGTERM);	return *this;}// define the default logs#ifdef _THREADS#ifndef _WIN32THREADS#if !(defined (CPU) && CPU == PPC603)pthread_mutex_t logmutex = PTHREAD_MUTEX_INITIALIZER;#endif#endif#endifAgentLog* DefaultLog::instance = 0;LogEntry* DefaultLog::entry = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -