/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2008-2011, Tomasz Sowa * All rights reserved. * */ #include "log.h" #include #include #include "utf8.h" Log::Log() { log_level = 1; current_level = 100; // nothing to log (call Init() first) request = 0; max_requests = 1; lines = 0; max_lines = 5000; log_file_open = false; } Log::~Log() { SaveLogAndClear(); } void Log::Init(int log_level_, bool save_each_line_, const std::string & log_file_, bool log_std, int log_max_requests) { log_level = log_level_; log_file = log_file_; log_stdout = log_std; max_requests = log_max_requests; save_each_line = save_each_line_; // don't open the file here // because it would be created with the root as an owner } void Log::OpenFile() { if( !log_file.empty() ) { file.open( log_file.c_str(), std::ios_base::out | std::ios_base::app ); log_file_open = true; } } void Log::PutDate(Manipulators m) { // logs are related to localtime time_t t = std::time(0); std::tm * loct = std::localtime(&t); char buffer[70]; sprintf(buffer, "%d.%02d.%02d %02d:%02d:%02d ", int(loct->tm_year + 1900), int(loct->tm_mon + 1), int(loct->tm_mday), int(loct->tm_hour), int(loct->tm_min), int(loct->tm_sec)); (*this) << m << buffer; } Log & Log::operator<<(const void * s) { if( current_level > log_level ) return *this; buffer << s; return *this; } Log & Log::operator<<(const char * s) { if( current_level > log_level ) return *this; if( !s ) return *this; buffer << s; return *this; } Log & Log::operator<<(const std::string & s) { if( current_level > log_level ) return *this; buffer << s; return *this; } Log & Log::operator<<(const std::string * s) { if( current_level > log_level ) return *this; buffer << *s; return *this; } Log & Log::operator<<(const wchar_t * s) { if( current_level <= log_level ) { if( s ) buffer << s; } return *this; } Log & Log::operator<<(const std::wstring & s) { if( current_level <= log_level ) { buffer << s; } return *this; } Log & Log::operator<<(const std::wstring * s) { if( current_level <= log_level ) { buffer << *s; } return *this; } Log & Log::operator<<(int s) { if( current_level <= log_level ) { buffer << s; } return *this; } Log & Log::operator<<(long s) { if( current_level <= log_level ) { buffer << s; } return *this; } Log & Log::operator<<(char s) { if( current_level <= log_level ) { buffer << s; } return *this; } Log & Log::operator<<(wchar_t s) { if( current_level <= log_level ) { buffer << s; } return *this; } Log & Log::operator<<(size_t s) { if( current_level <= log_level ) { buffer << s; } return *this; } Log & Log::operator<<(double s) { if( current_level <= log_level ) { buffer << s; } return *this; } Log & Log::operator<<(Manipulators m) { switch(m) { case logend: if( current_level <= log_level ) { buffer << '\n'; lines += 1; if( save_each_line ) SaveLogAndClear(); } break; case logsave: SaveLogAndClear(); break; case logendrequest: if( ++request >= max_requests || lines > max_lines ) SaveLogAndClear(); break; case log1: current_level = 1; break; case log2: current_level = 2; break; case log3: current_level = 3; break; case log4: current_level = 4; break; } return *this; } void Log::SystemErr(int err) { (*this) << "errno: " << err; const char * err_msg = strerror(err); if( err_msg ) (*this) << " (" << err_msg << ")"; } void Log::SaveLogAndClear() { SaveLog(); buffer.Clear(); request = 0; lines = 0; } void Log::SaveLog() { if( buffer.Str().empty() ) return; if( log_stdout ) Ezc::WideToUTF8(buffer.Str(), std::cout); if( log_file.empty() ) return; if( !log_file_open || !file ) { file.close(); file.clear(); OpenFile(); if( !file ) return; } Ezc::WideToUTF8(buffer.Str(), file); file.flush(); }