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_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);
|
||||
|
|
|
@ -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;
|
||||
|
|
76
core/log.cpp
76
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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue