2008-06-17 20:27:32 +04:00
/* -------------------------------------------------------------------------- */
2014-01-09 14:51:20 +04:00
/* Copyright 2002-2014, OpenNebula Project (OpenNebula.org), C12G Labs */
2008-06-17 20:27:32 +04:00
/* */
/* Licensed under the Apache License, Version 2.0 (the "License"); you may */
/* not use this file except in compliance with the License. You may obtain */
/* a copy of the License at */
/* */
/* http://www.apache.org/licenses/LICENSE-2.0 */
/* */
/* Unless required by applicable law or agreed to in writing, software */
/* distributed under the License is distributed on an "AS IS" BASIS, */
/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
/* See the License for the specific language governing permissions and */
/* limitations under the License. */
/* -------------------------------------------------------------------------- */
# ifndef _LOG_H_
# define _LOG_H_
# include <string>
# include <fstream>
2013-02-11 22:06:20 +04:00
# include <stdexcept>
2008-06-17 20:27:32 +04:00
2013-01-31 20:27:21 +04:00
# include "PoolObjectSQL.h"
2013-02-11 22:06:20 +04:00
# ifdef SYSLOG_LOG
# include "log4cpp / Priority.hh"
# endif /* SYSLOG_LOG */
2013-01-25 20:32:12 +04:00
2008-06-17 20:27:32 +04:00
using namespace std ;
2010-04-21 02:40:16 +04:00
/**
* The Logger class is an interface used by OpenNebula components to log
* messages
*/
2008-06-17 20:27:32 +04:00
class Log
{
public :
enum MessageType {
ERROR = 0 ,
WARNING = 1 ,
INFO = 2 ,
2010-04-21 02:40:16 +04:00
DEBUG = 3 ,
DDEBUG = 4 ,
DDDEBUG = 5
2008-06-17 20:27:32 +04:00
} ;
2010-04-21 02:40:16 +04:00
static const char error_names [ ] ;
Log ( const MessageType _level = WARNING ) : log_level ( _level ) { } ;
virtual ~ Log ( ) { } ;
2013-10-25 22:51:19 +04:00
MessageType get_log_level ( )
{
return log_level ;
}
2010-04-21 02:40:16 +04:00
// -------------------------------------------------------------------------
// Logger interface
// -------------------------------------------------------------------------
virtual void log (
2008-06-17 20:27:32 +04:00
const char * module ,
const MessageType type ,
2010-04-21 02:40:16 +04:00
const char * message ) = 0 ;
2008-06-17 20:27:32 +04:00
2010-04-21 02:40:16 +04:00
protected :
/**
* Minimum log level for the messages
*/
MessageType log_level ;
} ;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* Log messages to a log file
*/
class FileLog : public Log
{
public :
FileLog ( const string & file_name ,
const MessageType level = WARNING ,
ios_base : : openmode mode = ios_base : : app ) ;
virtual ~ FileLog ( ) ;
virtual void log (
2008-06-17 20:27:32 +04:00
const char * module ,
const MessageType type ,
const char * message ) ;
2013-01-25 20:32:12 +04:00
2008-06-17 20:27:32 +04:00
private :
2013-12-08 01:21:04 +04:00
string log_file_name ;
2010-04-21 02:40:16 +04:00
} ;
2008-06-17 20:27:32 +04:00
2010-04-21 02:40:16 +04:00
/**
* Log messages to a log file
*/
class FileLogTS : public FileLog
{
public :
FileLogTS ( const string & file_name ,
const MessageType level = WARNING ,
ios_base : : openmode mode = ios_base : : app )
: FileLog ( file_name , level , mode )
{
pthread_mutex_init ( & log_mutex , 0 ) ;
}
~ FileLogTS ( )
{
pthread_mutex_destroy ( & log_mutex ) ;
}
void log (
const char * module ,
const MessageType type ,
const char * message )
{
pthread_mutex_lock ( & log_mutex ) ;
FileLog : : log ( module , type , message ) ;
pthread_mutex_unlock ( & log_mutex ) ;
}
private :
pthread_mutex_t log_mutex ;
} ;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
*
*/
class CerrLog : public Log
{
public :
CerrLog ( const MessageType level = WARNING ) : Log ( level ) { } ;
~ CerrLog ( ) { } ;
void log (
const char * module ,
const MessageType type ,
const char * message ) ;
2008-06-17 20:27:32 +04:00
} ;
2013-01-25 20:32:12 +04:00
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
2013-02-11 22:06:20 +04:00
# ifdef SYSLOG_LOG
2013-01-25 20:32:12 +04:00
/**
* Send log messages to syslog
*/
class SysLog : public Log
{
public :
2013-02-01 21:49:03 +04:00
SysLog ( const MessageType level ,
const string & label ) ;
2013-01-25 20:32:12 +04:00
2013-02-01 21:49:03 +04:00
virtual ~ SysLog ( ) { } ;
2013-01-31 20:27:21 +04:00
virtual void log (
const char * module ,
const MessageType type ,
const char * message ) ;
static log4cpp : : Priority : : PriorityLevel get_priority_level (
const MessageType level ) ;
2013-02-01 21:49:03 +04:00
protected :
/**
* Specialized constructor only for derived classes that uses an initialzed
* SysLog system .
*/
SysLog ( const MessageType level ) : Log ( level ) { } ;
/**
* This is the root category name used by any syslog resource
* in the process
*/
static const char * CATEGORY ;
/**
* This is the daemon name + pid , used to label every message in the process
*/
static string LABEL ;
2013-01-31 20:27:21 +04:00
} ;
2013-02-11 22:06:20 +04:00
# else
/**
* Dummy syslog class
*/
class SysLog : public Log
{
public :
SysLog ( const MessageType level ,
const string & label ) {
throw runtime_error ( " Aborting oned, SysLog support not compiled! " ) ;
} ;
virtual ~ SysLog ( ) { } ;
virtual void log (
const char * module ,
const MessageType type ,
const char * message ) { } ;
} ;
# endif /* SYSLOG_LOG */
# ifdef SYSLOG_LOG
2013-01-31 20:27:21 +04:00
/**
2013-02-01 21:49:03 +04:00
* Send log messages to syslog per resource . It requires a Root Syslog
* to be initialized before using a SysLogResource
2013-01-31 20:27:21 +04:00
*/
class SysLogResource : public SysLog
{
public :
SysLogResource (
int oid ,
const PoolObjectSQL : : ObjectType obj_type ,
const MessageType clevel ) ;
2013-02-01 21:49:03 +04:00
virtual ~ SysLogResource ( ) { } ;
2013-01-25 20:32:12 +04:00
void log (
const char * module ,
const MessageType type ,
const char * message ) ;
2013-01-31 20:27:21 +04:00
2013-02-01 21:49:03 +04:00
protected :
/**
* This is the resource category name used by any syslog resource
* in the process
*/
static const char * CATEGORY ;
2013-01-31 20:27:21 +04:00
2013-02-01 21:49:03 +04:00
/**
* The resource log label
*/
2013-01-31 20:27:21 +04:00
string obj_label ;
2013-01-25 20:32:12 +04:00
} ;
2013-02-11 22:06:20 +04:00
# else
/**
* Dummy SysLogResource class
*/
class SysLogResource : public SysLog
{
public :
SysLogResource ( int oid ,
const PoolObjectSQL : : ObjectType obj_type ,
const MessageType clevel ) : SysLog ( clevel , " " ) {
throw runtime_error ( " Aborting oned, SysLog support not compiled! " ) ;
} ;
virtual ~ SysLogResource ( ) { } ;
void log (
const char * module ,
const MessageType type ,
const char * message ) { } ;
} ;
# endif /* SYSLOG_LOG */
2008-06-17 20:27:32 +04:00
# endif /* _LOG_H_ */