Commit 8c4820a8 authored by Pavel Vainerman's avatar Pavel Vainerman

(LogReader): сделал возможность задавать фильтр на выводимый тест (grep)

parent 3bfd900f
...@@ -25,7 +25,7 @@ static struct option longopts[] = ...@@ -25,7 +25,7 @@ static struct option longopts[] =
{ "off", required_argument, 0, 'o' }, { "off", required_argument, 0, 'o' },
{ "on", required_argument, 0, 'e' }, { "on", required_argument, 0, 'e' },
{ "save-loglevels", required_argument, 0, 'u' }, { "save-loglevels", required_argument, 0, 'u' },
{ "restore-loglevels", required_argument, 0, 'g' }, { "restore-loglevels", required_argument, 0, 'y' },
{ "view-default-loglevels", required_argument, 0, 'b' }, { "view-default-loglevels", required_argument, 0, 'b' },
{ "list", optional_argument, 0, 'l' }, { "list", optional_argument, 0, 'l' },
{ "rotate", optional_argument, 0, 'r' }, { "rotate", optional_argument, 0, 'r' },
...@@ -35,6 +35,7 @@ static struct option longopts[] = ...@@ -35,6 +35,7 @@ static struct option longopts[] =
{ "reconnect-delay", required_argument, 0, 'x' }, { "reconnect-delay", required_argument, 0, 'x' },
{ "logfile", required_argument, 0, 'w' }, { "logfile", required_argument, 0, 'w' },
{ "logfile-truncate", required_argument, 0, 'z' }, { "logfile-truncate", required_argument, 0, 'z' },
{ "grep", required_argument, 0, 'g' },
{ NULL, 0, 0, 0 } { NULL, 0, 0, 0 }
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
...@@ -60,10 +61,11 @@ static void print_help() ...@@ -60,10 +61,11 @@ static void print_help()
printf("[-e | --on] [logfilter] - On(enable) the write log file (if before disabled).\n"); printf("[-e | --on] [logfilter] - On(enable) the write log file (if before disabled).\n");
printf("[-r | --rotate] [logfilter] - rotate log file.\n"); printf("[-r | --rotate] [logfilter] - rotate log file.\n");
printf("[-u | --save-loglevels] [logfilter] - save log levels (disable restore after disconnected).\n"); printf("[-u | --save-loglevels] [logfilter] - save log levels (disable restore after disconnected).\n");
printf("[-g | --restore-loglevels] [logfilter] - restore default log levels.\n"); printf("[-y | --restore-loglevels] [logfilter] - restore default log levels.\n");
printf("[-b | --view-default-loglevels] [logfilter] - list of default log levels.\n"); printf("[-b | --view-default-loglevels] [logfilter] - list of default log levels.\n");
printf("[-l | --list] [logfilter] - List of managed logs.\n"); printf("[-l | --list] [logfilter] - List of managed logs.\n");
printf("[-g | --grep pattern - Print lines matching a pattern (c++ regexp)\n");
printf("[-f | --filter] logfilter - ('filter mode'). View log only from 'logfilter'(regexp)\n"); printf("[-f | --filter] logfilter - ('filter mode'). View log only from 'logfilter'(regexp)\n");
printf("\n"); printf("\n");
printf("Note: 'logfilter' - regexp for name of log. Default: ALL logs.\n"); printf("Note: 'logfilter' - regexp for name of log. Default: ALL logs.\n");
...@@ -90,12 +92,13 @@ int main( int argc, char** argv ) ...@@ -90,12 +92,13 @@ int main( int argc, char** argv )
timeout_t rdelay = 8000; timeout_t rdelay = 8000;
string logfile(""); string logfile("");
bool logtruncate = false; bool logtruncate = false;
std::string textfilter("");
try try
{ {
while(1) while(1)
{ {
opt = getopt_long(argc, argv, "chvlf:a:p:i:d:s:n:eorbx:w:zt:gub", longopts, &optindex); opt = getopt_long(argc, argv, "chvlf:a:p:i:d:s:n:eorbx:w:zt:g:uby:", longopts, &optindex);
if( opt == -1 ) if( opt == -1 )
break; break;
...@@ -187,7 +190,7 @@ int main( int argc, char** argv ) ...@@ -187,7 +190,7 @@ int main( int argc, char** argv )
} }
break; break;
case 'g': // --restore-loglevels case 'y': // --restore-loglevels
{ {
LogServerTypes::Command cmd = LogServerTypes::cmdRestoreLogLevel; LogServerTypes::Command cmd = LogServerTypes::cmdRestoreLogLevel;
std::string filter(""); std::string filter("");
...@@ -277,6 +280,10 @@ int main( int argc, char** argv ) ...@@ -277,6 +280,10 @@ int main( int argc, char** argv )
logfile = string(optarg); logfile = string(optarg);
break; break;
case 'g':
textfilter = string(optarg);
break;
case 'z': case 'z':
logtruncate = true; logtruncate = true;
break; break;
...@@ -303,6 +310,7 @@ int main( int argc, char** argv ) ...@@ -303,6 +310,7 @@ int main( int argc, char** argv )
lr.setCommandOnlyMode(cmdonly); lr.setCommandOnlyMode(cmdonly);
lr.setinTimeout(tout); lr.setinTimeout(tout);
lr.setReconnectDelay(rdelay); lr.setReconnectDelay(rdelay);
lr.setTextFilter(textfilter);
if( !logfile.empty() ) if( !logfile.empty() )
lr.log()->logFile(logfile, logtruncate); lr.log()->logFile(logfile, logtruncate);
......
...@@ -506,6 +506,8 @@ rm -f %buildroot%_libdir/*.la ...@@ -506,6 +506,8 @@ rm -f %buildroot%_libdir/*.la
%exclude %_pkgconfigdir/libUniSet2.pc %exclude %_pkgconfigdir/libUniSet2.pc
# history of current unpublished changes # history of current unpublished changes
- (LogReader): add '--grep' mode
- minor fixes
%changelog %changelog
* Tue Sep 12 2017 Alexei Takaseev <taf@altlinux.org> 2.6-alt19.1 * Tue Sep 12 2017 Alexei Takaseev <taf@altlinux.org> 2.6-alt19.1
......
...@@ -75,6 +75,11 @@ namespace uniset ...@@ -75,6 +75,11 @@ namespace uniset
reconDelay = msec; reconDelay = msec;
} }
inline void setTextFilter( const std::string& f )
{
textfilter = f;
}
DebugStream::StreamEvent_Signal signal_stream_event(); DebugStream::StreamEvent_Signal signal_stream_event();
void setLogLevel( Debug::type t ); void setLogLevel( Debug::type t );
...@@ -100,7 +105,8 @@ namespace uniset ...@@ -100,7 +105,8 @@ namespace uniset
std::string iaddr = { "" }; std::string iaddr = { "" };
int port = { 0 }; int port = { 0 };
bool cmdonly { false }; bool cmdonly { false };
unsigned int readcount = { 0 }; // количество циклов чтения size_t readcount = { 0 }; // количество циклов чтения
std::string textfilter = { "" };
DebugStream rlog; DebugStream rlog;
std::shared_ptr<DebugStream> outlog; // рабочий лог в который выводиться полученная информация.. std::shared_ptr<DebugStream> outlog; // рабочий лог в который выводиться полученная информация..
......
...@@ -315,7 +315,7 @@ namespace uniset ...@@ -315,7 +315,7 @@ namespace uniset
for( const auto& i : lst ) for( const auto& i : lst )
{ {
if( std::regex_match(i.name, rule) ) if( std::regex_search(i.name, rule) )
{ {
l.push_back(i); l.push_back(i);
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <Poco/Net/NetException.h> #include <Poco/Net/NetException.h>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include <regex>
#include "PassiveTimer.h" #include "PassiveTimer.h"
#include "Exceptions.h" #include "Exceptions.h"
#include "LogReader.h" #include "LogReader.h"
...@@ -301,6 +302,8 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C ...@@ -301,6 +302,8 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C
bool send_ok = cmd == LogServerTypes::cmdNOP ? true : false; bool send_ok = cmd == LogServerTypes::cmdNOP ? true : false;
std::regex rule(textfilter);
while( rcount > 0 ) while( rcount > 0 )
{ {
try try
...@@ -328,6 +331,10 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C ...@@ -328,6 +331,10 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C
send_ok = true; send_ok = true;
} }
// Если мы работаем с текстовым фильтром
// то надо читать построчно..
ostringstream line;
while( tcp->poll(UniSetTimer::millisecToPoco(inTimeout), Poco::Net::Socket::SELECT_READ) ) while( tcp->poll(UniSetTimer::millisecToPoco(inTimeout), Poco::Net::Socket::SELECT_READ) )
{ {
ssize_t n = tcp->available(); ssize_t n = tcp->available();
...@@ -337,7 +344,34 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C ...@@ -337,7 +344,34 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C
tcp->receiveBytes(buf, n); tcp->receiveBytes(buf, n);
buf[n] = '\0'; buf[n] = '\0';
outlog->any(false) << buf; if( textfilter.empty() )
{
outlog->any(false) << buf;
}
else
{
// Всё это пока не оптимально,
// но мы ведь и не спешим..
for( ssize_t i=0; i<n; i++ )
{
// пока не встретили конец строки
// наполняем line..
if( buf[i] != '\n' )
{
line << buf[i];
continue;
}
line << endl;
std::string s(line.str());
if( std::regex_search(s, rule) )
outlog->any(false) << s;
line.str("");
}
}
} }
else if( n == 0 && readcount <= 0 ) else if( n == 0 && readcount <= 0 )
break; break;
......
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