From ed9feaf5427b5abc36e04b002b597e9feb426b02 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Thu, 28 Jan 2010 21:09:48 +0000 Subject: [PATCH] changed: log is saved after some requests (config: log_request value) (performance) git-svn-id: svn://ttmath.org/publicrep/winix/trunk@563 e52654a7-88a9-db11-a3e9-0013d4bc506e --- core/config.cpp | 1 + core/data.h | 3 ++ core/log.cpp | 76 +++++++++++++++++++++++++++++--------- core/log.h | 9 ++++- core/notify.cpp | 1 + core/requestcontroller.cpp | 2 + main/main.cpp | 6 +-- 7 files changed, 75 insertions(+), 23 deletions(-) diff --git a/core/config.cpp b/core/config.cpp index bd8ade3..96d7bea 100755 --- a/core/config.cpp +++ b/core/config.cpp @@ -100,6 +100,7 @@ void Config::AssignValues() data.fcgi_socket_user = Text("fcgi_socket_user"); data.fcgi_socket_group = Text("fcgi_socket_group"); data.log_level = Int("log_level", 1); + data.log_request = Int("log_request", 1); if( !data.stdout_is_closed ) data.log_stdout = Bool("log_stdout", false); diff --git a/core/data.h b/core/data.h index 3f4857f..bdecb92 100755 --- a/core/data.h +++ b/core/data.h @@ -46,6 +46,9 @@ public: // logging to stdout too bool log_stdout; + // how many requests should be logged in the same time + // default: 1 + int log_request; // fast cgi: socket (unix domain) std::string fcgi_socket; diff --git a/core/log.cpp b/core/log.cpp index 54cf021..6a2eb30 100755 --- a/core/log.cpp +++ b/core/log.cpp @@ -15,16 +15,28 @@ 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) +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) @@ -45,6 +57,7 @@ void Log::PutDate(Manipulators m) + Log & Log::operator<<(const char * s) { if( !s ) @@ -56,6 +69,7 @@ return *this; } + Log & Log::operator<<(const std::string & s) { buffer << s; @@ -64,6 +78,7 @@ Log & Log::operator<<(const std::string & s) } + Log & Log::operator<<(const std::string * s) { buffer << *s; @@ -72,6 +87,7 @@ Log & Log::operator<<(const std::string * s) } + Log & Log::operator<<(int s) { buffer << s; @@ -80,6 +96,7 @@ Log & Log::operator<<(int s) } + Log & Log::operator<<(long s) { buffer << s; @@ -98,6 +115,7 @@ Log & Log::operator<<(char s) } + Log & Log::operator<<(size_t s) { buffer << s; @@ -106,6 +124,7 @@ Log & Log::operator<<(size_t s) } + Log & Log::operator<<(double s) { buffer << s; @@ -113,13 +132,34 @@ Log & Log::operator<<(double 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: @@ -142,32 +182,32 @@ return *this; void Log::SaveLog() { - int attempt = 2; - if( current_level > log_level ) return; + const std::string & source = buffer.str(); + + if( source.empty() ) + return; + if( log_stdout ) - std::cout << buffer.str() << std::endl; + std::cout << source; if( log_file.empty() ) return; - std::ofstream file; - - do - { - file.open( log_file.c_str(), std::ios_base::out | std::ios_base::app ); - - // if( !file ) - // sleep(1); - } - while( --attempt > 0 && !file ); - if( !file ) - return; + { + file.close(); + file.clear(); - file << buffer.str() << std::endl; + OpenFile(); + + if( !file ) + return; + } + + file << source << std::endl; } diff --git a/core/log.h b/core/log.h index bb8ede7..e1fb948 100755 --- a/core/log.h +++ b/core/log.h @@ -19,7 +19,7 @@ // !! dodac manipulator logsave, logi zostana zapisane pod koniec wykonywania jednego requesta (albo po kilku w zaleznosci od jakiejs opcji w konfigu) // logsave zostanie wywolane w requestcontroller.cpp przy konczeniu wykonywania requesta -enum Manipulators { logend, log1, log2, log3 }; +enum Manipulators { logsave, logsavenow, logend, log1, log2, log3 }; @@ -27,14 +27,19 @@ class Log { std::ostringstream buffer; int log_level, current_level; +int item, item_save; std::string log_file; bool log_stdout; +std::ofstream file; +int lines; + + void OpenFile(); public: Log(); - void Init(int log_l, const std::string & log_f, bool log_std); + void Init(int log_l, const std::string & log_f, bool log_std, int log_request); void PutDate(Manipulators m); Log & operator<<(const char * s); diff --git a/core/notify.cpp b/core/notify.cpp index 2f5b28f..a357baa 100755 --- a/core/notify.cpp +++ b/core/notify.cpp @@ -102,6 +102,7 @@ void Notify::SendEmail(const std::string & email, const std::string & message) pclose(sendmail); nlog << "Notify: email to: " << email << " has been sent" << logend; + nlog << logsave; } diff --git a/core/requestcontroller.cpp b/core/requestcontroller.cpp index ee41224..8e415ff 100755 --- a/core/requestcontroller.cpp +++ b/core/requestcontroller.cpp @@ -226,11 +226,13 @@ void RequestController::Loop() // !! this should be immediately after FCGX_Accept() but signals don't want to break FCGX_Accept if( data.signal_hup ) { + log << logsave; FCGX_Finish(); return; } request.ClearPostFileTmp(); + log << logsave; } } diff --git a/main/main.cpp b/main/main.cpp index 8d15480..b7892cb 100755 --- a/main/main.cpp +++ b/main/main.cpp @@ -90,8 +90,8 @@ int main(int argv, char ** argc) } - log.Init(data.log_level, data.log_file, data.log_stdout); - nlog.Init(data.log_level, data.log_notify_file, false); + log.Init(data.log_level, data.log_file, data.log_stdout, data.log_request); + nlog.Init(data.log_level, data.log_notify_file, false, 1); db.Init(data.db_database, data.db_user, data.db_pass); // data.base_server can be changed (stripped from 'http://' or a last slash) @@ -116,7 +116,7 @@ int main(int argv, char ** argc) signal(SIGHUP, signal_hup); req_controller.LoadSessions(); - log << log1 << "cmslu started" << logend; + log << log1 << "cmslu started" << logend << logsavenow; while( true ) {