Commit 3b4b4066 authored by Pavel Vainerman's avatar Pavel Vainerman

(LogDB): добавил отключение записи в БД, чтобы можно было запускать

на работу в режиме "микросервиса", только просмотр логов в реальном времени.
parent 842621e5
......@@ -100,6 +100,11 @@ LogDB::LogDB( const string& name, int argc, const char* const* argv, const strin
flushBufferTimer.set<LogDB, &LogDB::onCheckBuffer>(this);
wsactivate.set<LogDB, &LogDB::onActivate>(this);
bool dbDisabled = ( uniset::findArgParam("--" + prefix + "db-disable", argc, argv) != -1 );
if( dbDisabled )
dbinfo << myname << "(init): save to database DISABLED.." << endl;
UniXML::iterator sit(cnode);
if( !sit.goChildren() )
......@@ -146,7 +151,8 @@ LogDB::LogDB( const string& name, int argc, const char* const* argv, const strin
// l->tcp = make_shared<UTCPStream>();
l->dblog = dblog;
l->signal_on_read().connect(sigc::mem_fun(this, &LogDB::addLog));
if( !dbDisabled )
l->signal_on_read().connect(sigc::mem_fun(this, &LogDB::addLog));
// l->set(loop);
logservers.push_back(l);
......@@ -161,28 +167,30 @@ LogDB::LogDB( const string& name, int argc, const char* const* argv, const strin
}
const std::string dbfile = uniset::getArgParam("--" + prefix + "dbfile", argc, argv, it.getProp("dbfile"));
if( dbfile.empty() )
if( !dbDisabled )
{
ostringstream err;
err << name << "(init): dbfile (sqlite) not defined. Use: <LogDB name='" << name << "' dbfile='..' ...>";
dbcrit << err.str() << endl;
throw uniset::SystemError(err.str());
}
const std::string dbfile = uniset::getArgParam("--" + prefix + "dbfile", argc, argv, it.getProp("dbfile"));
db = unisetstd::make_unique<SQLiteInterface>();
if( dbfile.empty() )
{
ostringstream err;
err << name << "(init): dbfile (sqlite) not defined. Use: <LogDB name='" << name << "' dbfile='..' ...>";
dbcrit << err.str() << endl;
throw uniset::SystemError(err.str());
}
if( !db->connect(dbfile, false, SQLITE_OPEN_FULLMUTEX) )
{
ostringstream err;
err << myname
<< "(init): DB connection error: "
<< db->error();
dbcrit << err.str() << endl;
throw uniset::SystemError(err.str());
}
db = unisetstd::make_unique<SQLiteInterface>();
if( !db->connect(dbfile, false, SQLITE_OPEN_FULLMUTEX) )
{
ostringstream err;
err << myname
<< "(init): DB connection error: "
<< db->error();
dbcrit << err.str() << endl;
throw uniset::SystemError(err.str());
}
}
#ifndef DISABLE_REST_API
httpHost = uniset::getArgParam("--" + prefix + "httpserver-host", argc, argv, "localhost");
......@@ -222,7 +230,7 @@ LogDB::~LogDB()
//--------------------------------------------------------------------------------------------
void LogDB::flushBuffer()
{
if( qbuf.empty() || !db->isConnection() )
if( !db || qbuf.empty() || !db->isConnection() )
return;
// без BEGIN и COMMIT вставка большого количества данных будет тормозить!
......@@ -252,6 +260,9 @@ void LogDB::flushBuffer()
//--------------------------------------------------------------------------------------------
void LogDB::rotateDB()
{
if( !db )
return;
// ротация отключена
if( maxdbRecords == 0 )
return;
......@@ -349,6 +360,7 @@ void LogDB::help_print()
cout << "--prefix-max-records sz - Максимальное количество записей в БД. При превышении, старые удаляются. 0 - не удалять" << endl;
cout << "--prefix-overflow-factor float - Коэффициент переполнения, после которого запускается удаление старых записей. По умолчанию: 1.3" << endl;
cout << "--prefix-max-websockets num - Максимальное количество websocket-ов" << endl;
cout << "--prefix-db-disable - Отключить запись в БД" << endl;
}
// -----------------------------------------------------------------------------
void LogDB::run( bool async )
......@@ -370,8 +382,11 @@ void LogDB::evfinish()
// -----------------------------------------------------------------------------
void LogDB::evprepare()
{
flushBufferTimer.set(loop);
flushBufferTimer.start(0, tmFlushBuffer_sec);
if( db )
{
flushBufferTimer.set(loop);
flushBufferTimer.start(0, tmFlushBuffer_sec);
}
wsactivate.set(loop);
wsactivate.start();
......@@ -721,6 +736,16 @@ void LogDB::handleRequest( Poco::Net::HTTPServerRequest& req, Poco::Net::HTTPSer
return;
}
if( !db )
{
ostringstream err;
err << "Working with the database is disabled";
auto jdata = respError(resp, HTTPResponse::HTTP_SERVICE_UNAVAILABLE, err.str());
jdata->stringify(out);
out.flush();
return;
}
auto qp = uri.getQueryParameters();
resp.setStatus(HTTPResponse::HTTP_OK);
......
......@@ -134,7 +134,6 @@ namespace uniset
\todo WebSocket: доделать настройку всевозможных timeout-ов
\todo db: возможно всё-таки стоит парсить логи на предмет loglevel, и тогда уж и дату с временем вынимать
\todo web: генерировать html-страничку со списком подключения к логам с использованием готового шаблона
\todo db: ведение БД сделать отключаемым в настройках (чтобы можно было запускать только как сервис наблюдения за логами в реальном времени)
\todo db: сделать в RESET API команду включения или отключения запись логов в БД, для управления "на ходу"
*/
class LogDB:
......
......@@ -3,7 +3,7 @@
ulimit -Sc 1000000
#uniset2-start.sh -g \
./uniset2-logdb --logdb-single-confile logdb-conf.xml --logdb-name LogDB \
./uniset2-logdb --logdb-single-confile logdb-conf.xml --logdb-name LogDB --logdb-db-disable \
--logdb-log-add-levels any \
--logdb-dbfile ./test.db \
--logdb-buffer-size 5 \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment