/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2008-2010, Tomasz Sowa * All rights reserved. * */ #include "log.h" #include #include Log::Log() { log_level = 3; current_level = 4; // nothing to log (call Init() first) item = 0; item_save = 1; lines = 0; } void Log::Init(int log_l, const std::string & log_f, bool log_std, int log_request) { log_level = log_l; log_file = log_f; log_stdout = log_std; item_save = log_request; OpenFile(); } void Log::OpenFile() { if( !log_file.empty() ) file.open( log_file.c_str(), std::ios_base::out | std::ios_base::app ); } void Log::PutDate(Manipulators m) { 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 char * s) { if( !s ) return *this; buffer << s; return *this; } Log & Log::operator<<(const std::string & s) { buffer << s; return *this; } Log & Log::operator<<(const std::string * s) { buffer << *s; return *this; } Log & Log::operator<<(const void * s) { buffer << s; return *this; } Log & Log::operator<<(int s) { buffer << s; return *this; } Log & Log::operator<<(long s) { buffer << s; return *this; } Log & Log::operator<<(char s) { buffer << s; return *this; } Log & Log::operator<<(size_t s) { buffer << s; return *this; } Log & Log::operator<<(double s) { buffer << s; return *this; } Log & Log::operator<<(Manipulators m) { switch(m) { case logend: buffer << '\n'; lines += 1; break; case logsavenow: SaveLog(); buffer.str( "" ); item = 0; lines = 0; break; case logsave: item += 1; if( item >= item_save || lines > 3000 ) { SaveLog(); buffer.str( "" ); item = 0; lines = 0; } break; case log1: current_level = 1; break; case log2: current_level = 2; break; case log3: current_level = 3; 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::SaveLog() { if( current_level > log_level ) return; const std::string & source = buffer.str(); if( source.empty() ) return; if( log_stdout ) std::cout << source; if( log_file.empty() ) return; if( !file ) { file.close(); file.clear(); OpenFile(); if( !file ) return; } file << source << std::endl; }