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
This commit is contained in:
parent
09d427b4ba
commit
ed9feaf542
|
@ -100,6 +100,7 @@ void Config::AssignValues()
|
||||||
data.fcgi_socket_user = Text("fcgi_socket_user");
|
data.fcgi_socket_user = Text("fcgi_socket_user");
|
||||||
data.fcgi_socket_group = Text("fcgi_socket_group");
|
data.fcgi_socket_group = Text("fcgi_socket_group");
|
||||||
data.log_level = Int("log_level", 1);
|
data.log_level = Int("log_level", 1);
|
||||||
|
data.log_request = Int("log_request", 1);
|
||||||
|
|
||||||
if( !data.stdout_is_closed )
|
if( !data.stdout_is_closed )
|
||||||
data.log_stdout = Bool("log_stdout", false);
|
data.log_stdout = Bool("log_stdout", false);
|
||||||
|
|
|
@ -46,6 +46,9 @@ public:
|
||||||
// logging to stdout too
|
// logging to stdout too
|
||||||
bool log_stdout;
|
bool log_stdout;
|
||||||
|
|
||||||
|
// how many requests should be logged in the same time
|
||||||
|
// default: 1
|
||||||
|
int log_request;
|
||||||
|
|
||||||
// fast cgi: socket (unix domain)
|
// fast cgi: socket (unix domain)
|
||||||
std::string fcgi_socket;
|
std::string fcgi_socket;
|
||||||
|
|
76
core/log.cpp
76
core/log.cpp
|
@ -15,16 +15,28 @@ Log::Log()
|
||||||
{
|
{
|
||||||
log_level = 3;
|
log_level = 3;
|
||||||
current_level = 4; // nothing to log (call Init() first)
|
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_level = log_l;
|
||||||
log_file = log_f;
|
log_file = log_f;
|
||||||
log_stdout = log_std;
|
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)
|
void Log::PutDate(Manipulators m)
|
||||||
|
@ -45,6 +57,7 @@ void Log::PutDate(Manipulators m)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(const char * s)
|
Log & Log::operator<<(const char * s)
|
||||||
{
|
{
|
||||||
if( !s )
|
if( !s )
|
||||||
|
@ -56,6 +69,7 @@ return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(const std::string & s)
|
Log & Log::operator<<(const std::string & s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
buffer << s;
|
||||||
|
@ -64,6 +78,7 @@ Log & Log::operator<<(const std::string & s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(const std::string * s)
|
Log & Log::operator<<(const std::string * s)
|
||||||
{
|
{
|
||||||
buffer << *s;
|
buffer << *s;
|
||||||
|
@ -72,6 +87,7 @@ Log & Log::operator<<(const std::string * s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(int s)
|
Log & Log::operator<<(int s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
buffer << s;
|
||||||
|
@ -80,6 +96,7 @@ Log & Log::operator<<(int s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(long s)
|
Log & Log::operator<<(long s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
buffer << s;
|
||||||
|
@ -98,6 +115,7 @@ Log & Log::operator<<(char s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(size_t s)
|
Log & Log::operator<<(size_t s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
buffer << s;
|
||||||
|
@ -106,6 +124,7 @@ Log & Log::operator<<(size_t s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(double s)
|
Log & Log::operator<<(double s)
|
||||||
{
|
{
|
||||||
buffer << s;
|
buffer << s;
|
||||||
|
@ -113,13 +132,34 @@ Log & Log::operator<<(double s)
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Log & Log::operator<<(Manipulators m)
|
Log & Log::operator<<(Manipulators m)
|
||||||
{
|
{
|
||||||
switch(m)
|
switch(m)
|
||||||
{
|
{
|
||||||
case logend:
|
case logend:
|
||||||
|
buffer << '\n';
|
||||||
|
lines += 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case logsavenow:
|
||||||
SaveLog();
|
SaveLog();
|
||||||
buffer.str( "" );
|
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;
|
break;
|
||||||
|
|
||||||
case log1:
|
case log1:
|
||||||
|
@ -142,32 +182,32 @@ return *this;
|
||||||
|
|
||||||
void Log::SaveLog()
|
void Log::SaveLog()
|
||||||
{
|
{
|
||||||
int attempt = 2;
|
|
||||||
|
|
||||||
if( current_level > log_level )
|
if( current_level > log_level )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
const std::string & source = buffer.str();
|
||||||
|
|
||||||
|
if( source.empty() )
|
||||||
|
return;
|
||||||
|
|
||||||
if( log_stdout )
|
if( log_stdout )
|
||||||
std::cout << buffer.str() << std::endl;
|
std::cout << source;
|
||||||
|
|
||||||
if( log_file.empty() )
|
if( log_file.empty() )
|
||||||
return;
|
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 )
|
if( !file )
|
||||||
return;
|
{
|
||||||
|
file.close();
|
||||||
|
file.clear();
|
||||||
|
|
||||||
file << buffer.str() << std::endl;
|
OpenFile();
|
||||||
|
|
||||||
|
if( !file )
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
file << source << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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)
|
// !! 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
|
// 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;
|
std::ostringstream buffer;
|
||||||
int log_level, current_level;
|
int log_level, current_level;
|
||||||
|
int item, item_save;
|
||||||
std::string log_file;
|
std::string log_file;
|
||||||
bool log_stdout;
|
bool log_stdout;
|
||||||
|
std::ofstream file;
|
||||||
|
int lines;
|
||||||
|
|
||||||
|
void OpenFile();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
Log();
|
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);
|
void PutDate(Manipulators m);
|
||||||
Log & operator<<(const char * s);
|
Log & operator<<(const char * s);
|
||||||
|
|
|
@ -102,6 +102,7 @@ void Notify::SendEmail(const std::string & email, const std::string & message)
|
||||||
pclose(sendmail);
|
pclose(sendmail);
|
||||||
|
|
||||||
nlog << "Notify: email to: " << email << " has been sent" << logend;
|
nlog << "Notify: email to: " << email << " has been sent" << logend;
|
||||||
|
nlog << logsave;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -226,11 +226,13 @@ void RequestController::Loop()
|
||||||
// !! this should be immediately after FCGX_Accept() but signals don't want to break FCGX_Accept
|
// !! this should be immediately after FCGX_Accept() but signals don't want to break FCGX_Accept
|
||||||
if( data.signal_hup )
|
if( data.signal_hup )
|
||||||
{
|
{
|
||||||
|
log << logsave;
|
||||||
FCGX_Finish();
|
FCGX_Finish();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
request.ClearPostFileTmp();
|
request.ClearPostFileTmp();
|
||||||
|
log << logsave;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -90,8 +90,8 @@ int main(int argv, char ** argc)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
log.Init(data.log_level, data.log_file, data.log_stdout);
|
log.Init(data.log_level, data.log_file, data.log_stdout, data.log_request);
|
||||||
nlog.Init(data.log_level, data.log_notify_file, false);
|
nlog.Init(data.log_level, data.log_notify_file, false, 1);
|
||||||
db.Init(data.db_database, data.db_user, data.db_pass);
|
db.Init(data.db_database, data.db_user, data.db_pass);
|
||||||
|
|
||||||
// data.base_server can be changed (stripped from 'http://' or a last slash)
|
// 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);
|
signal(SIGHUP, signal_hup);
|
||||||
|
|
||||||
req_controller.LoadSessions();
|
req_controller.LoadSessions();
|
||||||
log << log1 << "cmslu started" << logend;
|
log << log1 << "cmslu started" << logend << logsavenow;
|
||||||
|
|
||||||
while( true )
|
while( true )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue