2008-06-17 16:27:32 +00:00
/* -------------------------------------------------------------------------- */
2024-07-29 14:25:20 +02:00
/* Copyright 2002-2024, OpenNebula Project, OpenNebula Systems */
2008-06-17 16:27:32 +00: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 19:06:20 +01:00
# include <stdexcept>
2016-03-02 17:07:27 +01:00
# include <syslog.h>
2008-06-17 16:27:32 +00:00
2013-01-31 17:27:21 +01:00
# include "PoolObjectSQL.h"
2010-04-21 00:40:16 +02:00
/**
* The Logger class is an interface used by OpenNebula components to log
* messages
*/
2008-06-17 16:27:32 +00:00
class Log
{
public :
2024-06-03 11:40:24 +02:00
enum MessageType
{
2008-06-17 16:27:32 +00:00
ERROR = 0 ,
WARNING = 1 ,
INFO = 2 ,
2010-04-21 00:40:16 +02:00
DEBUG = 3 ,
DDEBUG = 4 ,
DDDEBUG = 5
2008-06-17 16:27:32 +00:00
} ;
2022-06-08 18:27:38 +02:00
static const std : : string error_names [ ] ;
2010-04-21 00:40:16 +02:00
2024-06-03 11:40:24 +02:00
Log ( const MessageType _level = WARNING ) : log_level ( _level ) { } ;
2010-04-21 00:40:16 +02:00
2024-06-03 11:40:24 +02:00
virtual ~ Log ( ) { } ;
2010-04-21 00:40:16 +02:00
2020-07-05 22:01:32 +02:00
MessageType get_log_level ( ) const
2013-10-25 20:51:19 +02:00
{
return log_level ;
}
2014-06-25 20:41:59 +02:00
static void set_zone_id ( int zid )
{
zone_id = zid ;
}
2018-08-07 23:35:15 +02:00
// -------------------------------------------------------------------------
// Profiler Interface
// -------------------------------------------------------------------------
static void start_timer ( struct timespec * estart )
{
clock_gettime ( CLOCK_MONOTONIC , estart ) ;
}
static double stop_timer ( struct timespec * estart )
{
double sec ;
struct timespec eend ;
clock_gettime ( CLOCK_MONOTONIC , & eend ) ;
sec = ( eend . tv_sec + ( eend . tv_nsec * 1e-9 ) ) - ( estart - > tv_sec +
2024-06-03 11:40:24 +02:00
( estart - > tv_nsec * 1e-9 ) ) ;
2018-08-07 23:35:15 +02:00
return sec ;
}
2010-04-21 00:40:16 +02:00
// -------------------------------------------------------------------------
// Logger interface
// -------------------------------------------------------------------------
virtual void log (
2024-06-03 11:40:24 +02:00
const char * module ,
const MessageType type ,
const char * message ) = 0 ;
2008-06-17 16:27:32 +00:00
2010-04-21 00:40:16 +02:00
protected :
/**
* Minimum log level for the messages
*/
MessageType log_level ;
2014-06-25 20:41:59 +02:00
/**
* Zone ID for log messages , for all Log instances
2016-03-02 17:07:27 +01:00
* M
2014-06-25 20:41:59 +02:00
*/
static unsigned int zone_id ;
2010-04-21 00:40:16 +02:00
} ;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* Log messages to a log file
*/
class FileLog : public Log
{
public :
2020-07-02 22:42:10 +02:00
FileLog ( const std : : string & file_name ,
const MessageType level = WARNING ,
std : : ios_base : : openmode mode = std : : ios_base : : app ) ;
2010-04-21 00:40:16 +02:00
virtual ~ FileLog ( ) ;
2023-02-07 08:50:30 +01:00
void log (
2024-06-03 11:40:24 +02:00
const char * module ,
const MessageType type ,
const char * message ) override ;
2013-01-25 17:32:12 +01:00
2008-06-17 16:27:32 +00:00
private :
2020-07-02 22:42:10 +02:00
std : : string log_file_name ;
2010-04-21 00:40:16 +02:00
} ;
2008-06-17 16:27:32 +00:00
2010-04-21 00:40:16 +02:00
/**
* Log messages to a log file
*/
class FileLogTS : public FileLog
{
public :
2020-07-02 22:42:10 +02:00
FileLogTS ( const std : : string & file_name ,
const MessageType level = WARNING ,
std : : ios_base : : openmode mode = std : : ios_base : : app )
2024-06-03 11:40:24 +02:00
: FileLog ( file_name , level , mode )
2010-04-21 00:40:16 +02:00
{
}
2020-09-10 13:32:52 +02:00
~ FileLogTS ( ) = default ;
2010-04-21 00:40:16 +02:00
void log (
2024-06-03 11:40:24 +02:00
const char * module ,
const MessageType type ,
const char * message ) override
2010-04-21 00:40:16 +02:00
{
2020-09-10 13:32:52 +02:00
std : : lock_guard < std : : mutex > lock ( log_mutex ) ;
2024-06-03 11:40:24 +02:00
FileLog : : log ( module , type , message ) ;
2010-04-21 00:40:16 +02:00
}
private :
2020-09-10 13:32:52 +02:00
std : : mutex log_mutex ;
2010-04-21 00:40:16 +02:00
} ;
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
2016-03-02 17:07:27 +01:00
A Send log messages to the standard output stream std : : clog
2010-04-21 00:40:16 +02:00
*/
2016-03-02 17:07:27 +01:00
class StdLog : public Log
2010-04-21 00:40:16 +02:00
{
public :
2024-06-03 11:40:24 +02:00
StdLog ( const MessageType level ) : Log ( level ) { } ;
2016-03-02 23:01:07 +01:00
StdLog ( const MessageType level ,
int oid ,
const PoolObjectSQL : : ObjectType obj_type ) ;
2010-04-21 00:40:16 +02:00
2024-06-03 11:40:24 +02:00
~ StdLog ( ) { } ;
2010-04-21 00:40:16 +02:00
void log (
2024-06-03 11:40:24 +02:00
const char * module ,
const MessageType type ,
const char * message ) override ;
2016-03-02 23:01:07 +01:00
private :
2020-07-02 22:42:10 +02:00
std : : string resource_label ;
2008-06-17 16:27:32 +00:00
} ;
2013-01-25 17:32:12 +01:00
/* -------------------------------------------------------------------------- */
/* -------------------------------------------------------------------------- */
/**
* Send log messages to syslog
*/
class SysLog : public Log
{
public :
2020-07-02 22:42:10 +02:00
SysLog ( const MessageType level ,
const std : : string & label ) ;
2013-01-25 17:32:12 +01:00
2013-02-11 19:06:20 +01:00
SysLog ( const MessageType level ,
2016-03-02 17:07:27 +01:00
int oid ,
const PoolObjectSQL : : ObjectType obj_type ) ;
2013-02-11 19:06:20 +01:00
2024-06-03 11:40:24 +02:00
~ SysLog ( ) { } ;
2013-01-25 17:32:12 +01:00
void log (
2024-06-03 11:40:24 +02:00
const char * module ,
const MessageType type ,
const char * message ) override ;
2013-01-31 17:27:21 +01:00
2013-02-01 18:49:03 +01:00
/**
2016-03-02 17:07:27 +01:00
* Return the associated syslog level
2013-02-01 18:49:03 +01:00
*/
2016-03-02 17:07:27 +01: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 19:06:20 +01:00
2016-03-02 17:07:27 +01:00
private :
2020-07-02 22:42:10 +02:00
std : : string resource_label ;
2013-02-11 19:06:20 +01:00
} ;
2008-06-17 16:27:32 +00:00
# endif /* _LOG_H_ */