2008-06-17 20:27:32 +04:00
/* -------------------------------------------------------------------------- */
2016-05-04 13:33:23 +03:00
/* Copyright 2002-2016, OpenNebula Project, OpenNebula Systems */
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>
2016-03-02 19:07:27 +03:00
# include <syslog.h>
2008-06-17 20:27:32 +04:00
2013-01-31 20:27:21 +04:00
# include "PoolObjectSQL.h"
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 ;
}
2014-06-25 22:41:59 +04:00
static void set_zone_id ( int zid )
{
zone_id = zid ;
}
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 ;
2014-06-25 22:41:59 +04:00
/**
* Zone ID for log messages , for all Log instances
2016-03-02 19:07:27 +03:00
* M
2014-06-25 22:41:59 +04:00
*/
static unsigned int zone_id ;
2010-04-21 02:40:16 +04:00
} ;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* 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 ;
} ;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
2016-03-02 19:07:27 +03:00
A Send log messages to the standard output stream std : : clog
2010-04-21 02:40:16 +04:00
*/
2016-03-02 19:07:27 +03:00
class StdLog : public Log
2010-04-21 02:40:16 +04:00
{
public :
2016-03-03 01:01:07 +03:00
StdLog ( const MessageType level ) : Log ( level ) { } ;
StdLog ( const MessageType level ,
int oid ,
const PoolObjectSQL : : ObjectType obj_type ) ;
2010-04-21 02:40:16 +04:00
2016-03-02 19:07:27 +03:00
~ StdLog ( ) { } ;
2010-04-21 02:40:16 +04:00
void log (
const char * module ,
const MessageType type ,
const char * message ) ;
2016-03-03 01:01:07 +03:00
private :
string resource_label ;
2008-06-17 20:27:32 +04:00
} ;
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-11 22:06:20 +04:00
SysLog ( const MessageType level ,
2016-03-02 19:07:27 +03:00
int oid ,
const PoolObjectSQL : : ObjectType obj_type ) ;
2013-02-11 22:06:20 +04:00
2016-03-02 19:07:27 +03:00
~ SysLog ( ) { } ;
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
/**
2016-03-02 19:07:27 +03:00
* Return the associated syslog level
2013-02-01 21:49:03 +04:00
*/
2016-03-02 19:07:27 +03:00
inline static int level ( const MessageType level )
{
switch ( level )
{
case Log : : ERROR :
return LOG_ERR ;
case Log : : WARNING :
return LOG_WARNING ;
case Log : : INFO :
return LOG_INFO ;
case Log : : DEBUG :
case Log : : DDEBUG :
case Log : : DDDEBUG :
return LOG_DEBUG ;
}
return LOG_INFO ;
}
2013-02-11 22:06:20 +04:00
2016-03-02 19:07:27 +03:00
private :
string resource_label ;
2013-02-11 22:06:20 +04:00
} ;
2008-06-17 20:27:32 +04:00
# endif /* _LOG_H_ */