2013-03-19 13:04:30 +01:00
/******************************************************************************
* Icinga 2 *
2014-01-09 00:32:11 +01:00
* Copyright ( C ) 2012 - present Icinga Development Team ( http : //www.icinga.org) *
2013-03-19 13:04:30 +01:00
* *
* This program is free software ; you can redistribute it and / or *
* modify it under the terms of the GNU General Public License *
* as published by the Free Software Foundation ; either version 2 *
* of the License , or ( at your option ) any later version . *
* *
* This program is distributed in the hope that it will be useful , *
* but WITHOUT ANY WARRANTY ; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the *
* GNU General Public License for more details . *
* *
* You should have received a copy of the GNU General Public License *
* along with this program ; if not , write to the Free Software Foundation *
* Inc . , 51 Franklin St , Fifth Floor , Boston , MA 02110 - 1301 , USA . *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-09-25 10:55:50 +02:00
# include "compat/compatlogger.h"
2013-03-19 13:04:30 +01:00
# include "icinga/service.h"
2013-07-01 10:03:00 +02:00
# include "icinga/checkcommand.h"
2013-11-05 18:33:57 +01:00
# include "icinga/eventcommand.h"
2013-06-28 21:31:38 +02:00
# include "icinga/notification.h"
2013-03-19 13:04:30 +01:00
# include "icinga/macroprocessor.h"
2013-09-30 20:34:55 +02:00
# include "icinga/externalcommandprocessor.h"
2013-10-31 14:18:20 +01:00
# include "icinga/compatutility.h"
2013-03-20 11:11:46 +01:00
# include "config/configcompilercontext.h"
2013-03-19 13:04:30 +01:00
# include "base/dynamictype.h"
# include "base/objectlock.h"
# include "base/logger_fwd.h"
2013-03-20 11:11:46 +01:00
# include "base/exception.h"
2013-03-19 13:04:30 +01:00
# include "base/convert.h"
# include "base/application.h"
2013-03-25 18:36:15 +01:00
# include "base/utility.h"
# include "base/scriptfunction.h"
2013-03-19 13:04:30 +01:00
# include <boost/foreach.hpp>
2013-07-02 13:38:06 +02:00
# include <boost/algorithm/string.hpp>
2013-03-19 13:04:30 +01:00
using namespace icinga ;
2013-09-25 10:55:50 +02:00
REGISTER_TYPE ( CompatLogger ) ;
REGISTER_SCRIPTFUNCTION ( ValidateRotationMethod , & CompatLogger : : ValidateRotationMethod ) ;
2013-03-19 13:04:30 +01:00
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : Start ( void )
2013-03-19 13:04:30 +01:00
{
2013-09-09 10:06:49 +02:00
DynamicObject : : Start ( ) ;
2013-09-25 10:55:50 +02:00
Service : : OnNewCheckResult . connect ( bind ( & CompatLogger : : CheckResultHandler , this , _1 , _2 ) ) ;
2013-10-29 13:44:43 +01:00
Service : : OnNotificationSentToUser . connect ( bind ( & CompatLogger : : NotificationSentHandler , this , _1 , _2 , _3 , _4 , _5 , _6 , _7 ) ) ;
2013-09-25 10:55:50 +02:00
Service : : OnFlappingChanged . connect ( bind ( & CompatLogger : : FlappingHandler , this , _1 , _2 ) ) ;
Service : : OnDowntimeTriggered . connect ( boost : : bind ( & CompatLogger : : TriggerDowntimeHandler , this , _1 , _2 ) ) ;
Service : : OnDowntimeRemoved . connect ( boost : : bind ( & CompatLogger : : RemoveDowntimeHandler , this , _1 , _2 ) ) ;
2013-11-05 18:33:57 +01:00
Service : : OnEventCommandExecuted . connect ( bind ( & CompatLogger : : EventCommandHandler , this , _1 ) ) ;
2013-10-09 14:56:03 +02:00
ExternalCommandProcessor : : OnNewExternalCommand . connect ( boost : : bind ( & CompatLogger : : ExternalCommandHandler , this , _2 , _3 ) ) ;
2013-06-28 16:08:43 +02:00
2013-11-06 08:51:56 +01:00
m_RotationTimer = make_shared < Timer > ( ) ;
2013-09-25 10:55:50 +02:00
m_RotationTimer - > OnTimerExpired . connect ( boost : : bind ( & CompatLogger : : RotationTimerHandler , this ) ) ;
2013-03-19 13:04:30 +01:00
m_RotationTimer - > Start ( ) ;
2013-03-20 11:11:46 +01:00
ReopenFile ( false ) ;
ScheduleNextRotation ( ) ;
2013-03-19 13:04:30 +01:00
}
/**
* @ threadsafety Always .
*/
2013-11-09 14:22:38 +01:00
void CompatLogger : : CheckResultHandler ( const Service : : Ptr & service , const CheckResult : : Ptr & cr )
2013-03-19 13:04:30 +01:00
{
Host : : Ptr host = service - > GetHost ( ) ;
2013-11-09 14:22:38 +01:00
Dictionary : : Ptr vars_after = cr - > GetVarsAfter ( ) ;
2013-03-19 13:04:30 +01:00
long state_after = vars_after - > Get ( " state " ) ;
long stateType_after = vars_after - > Get ( " state_type " ) ;
long attempt_after = vars_after - > Get ( " attempt " ) ;
bool reachable_after = vars_after - > Get ( " reachable " ) ;
bool host_reachable_after = vars_after - > Get ( " host_reachable " ) ;
2013-11-09 14:22:38 +01:00
Dictionary : : Ptr vars_before = cr - > GetVarsBefore ( ) ;
2013-03-19 13:04:30 +01:00
if ( vars_before ) {
long state_before = vars_before - > Get ( " state " ) ;
long stateType_before = vars_before - > Get ( " state_type " ) ;
long attempt_before = vars_before - > Get ( " attempt " ) ;
bool reachable_before = vars_before - > Get ( " reachable " ) ;
if ( state_before = = state_after & & stateType_before = = stateType_after & &
attempt_before = = attempt_after & & reachable_before = = reachable_after )
return ; /* Nothing changed, ignore this checkresult. */
}
2013-10-31 14:18:20 +01:00
String output ;
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-06-26 18:23:59 +02:00
2013-03-19 13:04:30 +01:00
std : : ostringstream msgbuf ;
msgbuf < < " SERVICE ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < Service : : StateToString ( static_cast < ServiceState > ( state_after ) ) < < " ; "
< < Service : : StateTypeToString ( static_cast < StateType > ( stateType_after ) ) < < " ; "
< < attempt_after < < " ; "
2013-06-26 18:23:59 +02:00
< < output < < " "
2013-03-19 13:04:30 +01:00
< < " " ;
2013-06-24 08:56:13 +02:00
{
ObjectLock olock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
2013-03-19 13:04:30 +01:00
2013-09-25 09:12:15 +02:00
if ( service = = host - > GetCheckService ( ) ) {
2013-03-19 13:04:30 +01:00
std : : ostringstream msgbuf ;
msgbuf < < " HOST ALERT: "
< < host - > GetName ( ) < < " ; "
< < Host : : StateToString ( Host : : CalculateState ( static_cast < ServiceState > ( state_after ) , host_reachable_after ) ) < < " ; "
< < Service : : StateTypeToString ( static_cast < StateType > ( stateType_after ) ) < < " ; "
< < attempt_after < < " ; "
2013-06-26 18:23:59 +02:00
< < output < < " "
2013-03-19 13:04:30 +01:00
< < " " ;
2013-06-24 08:56:13 +02:00
{
ObjectLock olock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
2013-03-19 13:04:30 +01:00
}
2013-06-24 08:56:13 +02:00
{
ObjectLock olock ( this ) ;
Flush ( ) ;
}
2013-03-19 13:04:30 +01:00
}
2013-09-17 19:40:23 +02:00
/**
* @ threadsafety Always .
*/
2013-11-09 22:08:26 +01:00
void CompatLogger : : TriggerDowntimeHandler ( const Service : : Ptr & service , const Downtime : : Ptr & downtime )
2013-09-17 19:40:23 +02:00
{
Host : : Ptr host = service - > GetHost ( ) ;
if ( ! downtime )
return ;
std : : ostringstream msgbuf ;
msgbuf < < " SERVICE DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
2013-09-18 10:08:28 +02:00
< < " STARTED " < < " ; "
< < " Service has entered a period of scheduled downtime. "
2013-09-17 19:40:23 +02:00
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
2013-09-25 09:12:15 +02:00
if ( service = = host - > GetCheckService ( ) ) {
2013-09-17 19:40:23 +02:00
std : : ostringstream msgbuf ;
msgbuf < < " HOST DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
2013-09-18 10:08:28 +02:00
< < " STARTED " < < " ; "
< < " Service has entered a period of scheduled downtime. "
2013-09-17 19:40:23 +02:00
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
}
{
ObjectLock oLock ( this ) ;
Flush ( ) ;
}
}
/**
* @ threadsafety Always .
*/
2013-11-09 22:08:26 +01:00
void CompatLogger : : RemoveDowntimeHandler ( const Service : : Ptr & service , const Downtime : : Ptr & downtime )
2013-09-17 19:40:23 +02:00
{
Host : : Ptr host = service - > GetHost ( ) ;
if ( ! downtime )
return ;
String downtime_output ;
String downtime_state_str ;
2013-11-09 22:08:26 +01:00
if ( downtime - > GetWasCancelled ( ) ) {
2013-09-17 19:40:23 +02:00
downtime_output = " Scheduled downtime for service has been cancelled. " ;
downtime_state_str = " CANCELLED " ;
} else {
downtime_output = " Service has exited from a period of scheduled downtime. " ;
downtime_state_str = " STOPPED " ;
}
std : : ostringstream msgbuf ;
msgbuf < < " SERVICE DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < downtime_state_str < < " ; "
< < downtime_output
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
2013-09-25 09:12:15 +02:00
if ( service = = host - > GetCheckService ( ) ) {
2013-09-17 19:40:23 +02:00
std : : ostringstream msgbuf ;
msgbuf < < " HOST DOWNTIME ALERT: "
< < host - > GetName ( ) < < " ; "
< < downtime_state_str < < " ; "
< < downtime_output
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
}
{
ObjectLock oLock ( this ) ;
Flush ( ) ;
}
}
2013-06-28 13:40:01 +02:00
2013-06-28 21:31:38 +02:00
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : NotificationSentHandler ( const Service : : Ptr & service , const User : : Ptr & user ,
2013-11-09 14:22:38 +01:00
NotificationType const & notification_type , CheckResult : : Ptr const & cr ,
const String & author , const String & comment_text , const String & command_name )
2013-06-28 21:31:38 +02:00
{
Host : : Ptr host = service - > GetHost ( ) ;
String notification_type_str = Notification : : NotificationTypeToString ( notification_type ) ;
String author_comment = " " ;
if ( notification_type = = NotificationCustom | | notification_type = = NotificationAcknowledgement ) {
2013-10-29 13:44:43 +01:00
author_comment = author + " ; " + comment_text ;
2013-06-28 21:31:38 +02:00
}
if ( ! cr )
return ;
String output ;
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-06-28 21:31:38 +02:00
std : : ostringstream msgbuf ;
msgbuf < < " SERVICE NOTIFICATION: "
2013-08-20 11:06:04 +02:00
< < user - > GetName ( ) < < " ; "
2013-06-28 21:31:38 +02:00
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < notification_type_str < < " "
< < " ( " < < Service : : StateToString ( service - > GetState ( ) ) < < " ); "
2013-10-29 13:44:43 +01:00
< < command_name < < " ; "
< < output < < " ; "
< < author_comment
2013-06-28 21:31:38 +02:00
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
2013-09-25 09:12:15 +02:00
if ( service = = host - > GetCheckService ( ) ) {
2013-06-28 21:31:38 +02:00
std : : ostringstream msgbuf ;
msgbuf < < " HOST NOTIFICATION: "
2013-08-20 11:06:04 +02:00
< < user - > GetName ( ) < < " ; "
2013-06-28 21:31:38 +02:00
< < host - > GetName ( ) < < " ; "
< < notification_type_str < < " "
< < " ( " < < Service : : StateToString ( service - > GetState ( ) ) < < " ); "
2013-10-29 13:44:43 +01:00
< < command_name < < " ; "
< < output < < " ; "
< < author_comment
2013-06-28 21:31:38 +02:00
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
}
{
ObjectLock oLock ( this ) ;
Flush ( ) ;
}
}
2013-07-01 14:29:07 +02:00
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : FlappingHandler ( const Service : : Ptr & service , FlappingState flapping_state )
2013-07-01 14:29:07 +02:00
{
Host : : Ptr host = service - > GetHost ( ) ;
String flapping_state_str ;
String flapping_output ;
switch ( flapping_state ) {
case FlappingStarted :
2013-07-01 14:49:04 +02:00
flapping_output = " Service appears to have started flapping ( " + Convert : : ToString ( service - > GetFlappingCurrent ( ) ) + " % change >= " + Convert : : ToString ( service - > GetFlappingThreshold ( ) ) + " % threshold) " ;
2013-07-01 14:29:07 +02:00
flapping_state_str = " STARTED " ;
break ;
case FlappingStopped :
2013-07-01 14:49:04 +02:00
flapping_output = " Service appears to have stopped flapping ( " + Convert : : ToString ( service - > GetFlappingCurrent ( ) ) + " % change < " + Convert : : ToString ( service - > GetFlappingThreshold ( ) ) + " % threshold) " ;
2013-07-01 14:29:07 +02:00
flapping_state_str = " STOPPED " ;
break ;
case FlappingDisabled :
flapping_output = " Flap detection has been disabled " ;
flapping_state_str = " DISABLED " ;
break ;
default :
Log ( LogCritical , " compat " , " Unknown flapping state: " + Convert : : ToString ( flapping_state ) ) ;
return ;
}
std : : ostringstream msgbuf ;
msgbuf < < " SERVICE FLAPPING ALERT: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < flapping_state_str < < " ; "
< < flapping_output
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
2013-09-25 09:12:15 +02:00
if ( service = = host - > GetCheckService ( ) ) {
2013-07-01 14:29:07 +02:00
std : : ostringstream msgbuf ;
msgbuf < < " HOST FLAPPING ALERT: "
< < host - > GetName ( ) < < " ; "
< < flapping_state_str < < " ; "
< < flapping_output
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
}
{
ObjectLock oLock ( this ) ;
Flush ( ) ;
}
}
2013-06-28 21:31:38 +02:00
2013-09-30 20:34:55 +02:00
void CompatLogger : : ExternalCommandHandler ( const String & command , const std : : vector < String > & arguments )
{
std : : ostringstream msgbuf ;
msgbuf < < " EXTERNAL COMMAND: "
< < command < < " ; "
< < boost : : algorithm : : join ( arguments , " ; " )
< < " " ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
}
2013-11-05 18:33:57 +01:00
void CompatLogger : : EventCommandHandler ( const Service : : Ptr & service )
{
Host : : Ptr host = service - > GetHost ( ) ;
EventCommand : : Ptr event_command = service - > GetEventCommand ( ) ;
String event_command_name = event_command - > GetName ( ) ;
String state = Service : : StateToString ( service - > GetState ( ) ) ;
String state_type = Service : : StateTypeToString ( service - > GetStateType ( ) ) ;
long current_attempt = service - > GetCheckAttempt ( ) ;
std : : ostringstream msgbuf ;
msgbuf < < " SERVICE EVENT HANDLER: "
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < state < < " ; "
< < state_type < < " ; "
< < current_attempt < < " ; "
< < event_command_name ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
if ( service = = host - > GetCheckService ( ) ) {
std : : ostringstream msgbuf ;
msgbuf < < " HOST EVENT HANDLER: "
< < host - > GetName ( ) < < " ; "
< < state < < " ; "
< < state_type < < " ; "
< < current_attempt < < " ; "
< < event_command_name ;
{
ObjectLock oLock ( this ) ;
WriteLine ( msgbuf . str ( ) ) ;
}
}
{
ObjectLock oLock ( this ) ;
Flush ( ) ;
}
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : WriteLine ( const String & line )
2013-03-19 13:04:30 +01:00
{
ASSERT ( OwnsLock ( ) ) ;
if ( ! m_OutputFile . good ( ) )
return ;
m_OutputFile < < " [ " < < ( long ) Utility : : GetTime ( ) < < " ] " < < line < < " \n " ;
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : Flush ( void )
2013-03-19 13:04:30 +01:00
{
ASSERT ( OwnsLock ( ) ) ;
if ( ! m_OutputFile . good ( ) )
return ;
m_OutputFile < < std : : flush ;
}
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : ReopenFile ( bool rotate )
2013-03-19 13:04:30 +01:00
{
ObjectLock olock ( this ) ;
String tempFile = GetLogDir ( ) + " /icinga.log " ;
2013-03-20 11:11:46 +01:00
if ( m_OutputFile ) {
2013-03-19 13:04:30 +01:00
m_OutputFile . close ( ) ;
2013-03-20 11:11:46 +01:00
if ( rotate ) {
String archiveFile = GetLogDir ( ) + " /archives/icinga- " + Utility : : FormatDateTime ( " %m-%d-%Y-%H " , Utility : : GetTime ( ) ) + " .log " ;
Log ( LogInformation , " compat " , " Rotating compat log file ' " + tempFile + " ' -> ' " + archiveFile + " ' " ) ;
( void ) rename ( tempFile . CStr ( ) , archiveFile . CStr ( ) ) ;
}
2013-03-19 13:04:30 +01:00
}
2013-03-20 11:11:46 +01:00
m_OutputFile . open ( tempFile . CStr ( ) , std : : ofstream : : app ) ;
2013-03-19 13:04:30 +01:00
if ( ! m_OutputFile . good ( ) ) {
Log ( LogWarning , " icinga " , " Could not open compat log file ' " + tempFile + " ' for writing. Log output will be lost. " ) ;
return ;
}
2013-03-20 11:11:46 +01:00
WriteLine ( " LOG ROTATION: " + GetRotationMethod ( ) ) ;
2013-03-19 13:04:30 +01:00
WriteLine ( " LOG VERSION: 2.0 " ) ;
2013-08-20 11:06:04 +02:00
BOOST_FOREACH ( const Host : : Ptr & host , DynamicType : : GetObjects < Host > ( ) ) {
2013-09-25 09:12:15 +02:00
Service : : Ptr hc = host - > GetCheckService ( ) ;
2013-03-19 13:04:30 +01:00
if ( ! hc )
continue ;
bool reachable = host - > IsReachable ( ) ;
ObjectLock olock ( hc ) ;
2013-10-31 14:18:20 +01:00
String output ;
2013-11-09 14:22:38 +01:00
CheckResult : : Ptr cr = hc - > GetLastCheckResult ( ) ;
2013-10-31 14:18:20 +01:00
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-10-31 14:18:20 +01:00
2013-03-19 13:04:30 +01:00
std : : ostringstream msgbuf ;
2013-10-29 13:44:43 +01:00
msgbuf < < " CURRENT HOST STATE: "
2013-03-19 13:04:30 +01:00
< < host - > GetName ( ) < < " ; "
< < Host : : StateToString ( Host : : CalculateState ( hc - > GetState ( ) , reachable ) ) < < " ; "
< < Service : : StateTypeToString ( hc - > GetStateType ( ) ) < < " ; "
2013-10-26 09:41:45 +02:00
< < hc - > GetCheckAttempt ( ) < < " ; "
2013-10-31 14:18:20 +01:00
< < output < < " " ;
2013-03-19 13:04:30 +01:00
WriteLine ( msgbuf . str ( ) ) ;
}
2013-08-20 11:06:04 +02:00
BOOST_FOREACH ( const Service : : Ptr & service , DynamicType : : GetObjects < Service > ( ) ) {
2013-03-19 13:04:30 +01:00
Host : : Ptr host = service - > GetHost ( ) ;
2013-10-31 14:18:20 +01:00
String output ;
2013-11-09 14:22:38 +01:00
CheckResult : : Ptr cr = service - > GetLastCheckResult ( ) ;
2013-10-31 14:18:20 +01:00
2013-12-05 14:54:16 +01:00
if ( cr )
output = CompatUtility : : GetCheckResultOutput ( cr ) ;
2013-10-31 14:18:20 +01:00
2013-03-19 13:04:30 +01:00
std : : ostringstream msgbuf ;
2013-10-29 13:44:43 +01:00
msgbuf < < " CURRENT SERVICE STATE: "
2013-03-19 13:04:30 +01:00
< < host - > GetName ( ) < < " ; "
< < service - > GetShortName ( ) < < " ; "
< < Service : : StateToString ( service - > GetState ( ) ) < < " ; "
< < Service : : StateTypeToString ( service - > GetStateType ( ) ) < < " ; "
2013-10-26 09:41:45 +02:00
< < service - > GetCheckAttempt ( ) < < " ; "
2013-10-31 14:18:20 +01:00
< < output < < " " ;
2013-03-19 13:04:30 +01:00
WriteLine ( msgbuf . str ( ) ) ;
}
Flush ( ) ;
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : ScheduleNextRotation ( void )
2013-03-20 11:11:46 +01:00
{
time_t now = ( time_t ) Utility : : GetTime ( ) ;
String method = GetRotationMethod ( ) ;
tm tmthen ;
# ifdef _MSC_VER
tm * temp = localtime ( & now ) ;
if ( temp = = NULL ) {
BOOST_THROW_EXCEPTION ( posix_error ( )
< < boost : : errinfo_api_function ( " localtime " )
< < boost : : errinfo_errno ( errno ) ) ;
}
tmthen = * temp ;
# else /* _MSC_VER */
if ( localtime_r ( & now , & tmthen ) = = NULL ) {
BOOST_THROW_EXCEPTION ( posix_error ( )
< < boost : : errinfo_api_function ( " localtime_r " )
< < boost : : errinfo_errno ( errno ) ) ;
}
# endif /* _MSC_VER */
tmthen . tm_min = 0 ;
tmthen . tm_sec = 0 ;
if ( method = = " HOURLY " ) {
tmthen . tm_hour + + ;
} else if ( method = = " DAILY " ) {
tmthen . tm_mday + + ;
tmthen . tm_hour = 0 ;
} else if ( method = = " WEEKLY " ) {
tmthen . tm_mday + = 7 - tmthen . tm_wday ;
tmthen . tm_hour = 0 ;
} else if ( method = = " MONTHLY " ) {
tmthen . tm_mon + + ;
tmthen . tm_mday = 1 ;
tmthen . tm_hour = 0 ;
}
time_t ts = mktime ( & tmthen ) ;
Log ( LogInformation , " compat " , " Rescheduling rotation timer for compat log ' "
+ GetName ( ) + " ' to ' " + Utility : : FormatDateTime ( " %Y/%m/%d %H:%M:%S %z " , ts ) + " ' " ) ;
m_RotationTimer - > Reschedule ( ts ) ;
}
2013-03-19 13:04:30 +01:00
/**
* @ threadsafety Always .
*/
2013-09-25 10:55:50 +02:00
void CompatLogger : : RotationTimerHandler ( void )
2013-03-19 13:04:30 +01:00
{
2013-03-20 11:11:46 +01:00
try {
ReopenFile ( true ) ;
} catch ( . . . ) {
ScheduleNextRotation ( ) ;
throw ;
}
ScheduleNextRotation ( ) ;
}
2013-09-25 10:55:50 +02:00
void CompatLogger : : ValidateRotationMethod ( const String & location , const Dictionary : : Ptr & attrs )
2013-03-20 11:11:46 +01:00
{
Value rotation_method = attrs - > Get ( " rotation_method " ) ;
if ( ! rotation_method . IsEmpty ( ) & & rotation_method ! = " HOURLY " & & rotation_method ! = " DAILY " & &
rotation_method ! = " WEEKLY " & & rotation_method ! = " MONTHLY " & & rotation_method ! = " NONE " ) {
2013-09-24 13:13:14 +02:00
ConfigCompilerContext : : GetInstance ( ) - > AddMessage ( true , " Validation failed for " +
2013-03-20 11:11:46 +01:00
location + " : Rotation method ' " + rotation_method + " ' is invalid. " ) ;
}
2013-03-19 13:04:30 +01:00
}
2013-08-20 11:06:04 +02:00