32 void osdlog(
const std::string & msg_r,
unsigned level_r )
43 static const char * ansi[] = {
51 static const unsigned n =
sizeof(ansi)/
sizeof(
const char *);
54 case 'w': level_r = 0;
break;
55 case 'c': level_r = 1;
break;
56 case 'y': level_r = 2;
break;
57 case 'g': level_r = 3;
break;
58 case 'r': level_r = 4;
break;
59 case 'm': level_r = 5;
break;
61 std::cerr << ansi[level_r%n] <<
"OSD[" << msg_r <<
"]\033[0m" << std::endl;
68 :
_file( std::move(file_r) )
69 , _fnc( std::move(fnc_r) )
97 if ( file_r == Pathname(
"-") )
107 int fd = ::open( file_r.c_str(), O_CREAT|O_EXCL, mode_r );
112 std::ofstream * fstr = 0;
113 _outs.reset( (fstr =
new std::ofstream( file_r.asString().c_str(), std::ios_base::app )) );
114 fstr->rdbuf()->pubsetbuf(0,0);
135 const std::string & message_r )
137 static char hostname[1024];
138 static char nohostname[] =
"unknown";
140 return str::form(
"%s <%d> %s(%d) [%s] %s(%s):%d %s",
141 now.c_str(), level_r,
142 ( gethostname( hostname, 1024 ) ? nohostname : hostname ),
145 file_r, func_r, line_r,
154 const char * file_r,
const char * func_r,
int line_r,
155 const std::string & buffer_r );
180 void tagSet(
const char * fil_r,
const char * fnc_r,
int lne_r )
189 virtual std::streamsize xsputn(
const char * s, std::streamsize n )
190 {
return writeout( s, n ); }
192 virtual int overflow(
int ch = EOF )
202 virtual int writeout(
const char* s, std::streamsize n )
209 for (
int i = 0; i < n; ++i, ++c )
212 _buffer += std::string( s, c-s );
220 _buffer += std::string( s, c-s );
246 : _mybuf( group_r, level_r )
247 , _mystream( &_mybuf )
251 { _mystream.flush(); }
255 std::ostream &
getStream(
const char * fil_r,
const char * fnc_r,
int lne_r )
257 _mybuf.tagSet( fil_r, fnc_r, lne_r );
284 {
return _excessive; }
286 void excessive(
bool onOff_r )
287 { _excessive = onOff_r; }
291 { _lineWriter = writer_r; }
294 {
return _lineWriter; }
300 _lineFormater = format_r;
305 void logfile(
const Pathname & logfile_r, mode_t mode_r = 0640 )
307 if ( logfile_r.empty() )
309 else if ( logfile_r == Pathname(
"-" ) )
332 if ( level_r ==
E_XXX && !_excessive )
335 if ( !_streamtable[group_r][level_r] )
337 _streamtable[group_r][level_r].reset(
new Loglinestream( group_r, level_r ) );
339 std::ostream & ret( _streamtable[group_r][level_r]->
getStream( file_r, func_r, line_r ) );
343 ret <<
"---<RESET LOGSTREAM FROM FAILED STATE]" << endl;
354 const std::string & message_r )
357 _lineWriter->writeOut( _lineFormater->format( group_r, level_r,
358 file_r, func_r, line_r,
375 , _excessive( getenv(
"ZYPP_FULLLOG") )
376 , _lineFormater( new
LogControl::LineFormater )
378 if ( getenv(
"ZYPP_LOGFILE") )
379 logfile( getenv(
"ZYPP_LOGFILE") );
381 if ( getenv(
"ZYPP_PROFILING") )
416 return str <<
"LogControlImpl";
431 return LogControlImpl::instance().getStream( group_r,
440 const char * file_r,
const char * func_r,
int line_r,
441 const std::string & buffer_r )
443 LogControlImpl::instance().putStream( group_r, level_r,
444 file_r, func_r, line_r,
449 {
return LogControlImpl::instance().isExcessive(); }
462 using logger::LogControlImpl;
465 { LogControlImpl::instance().logfile( logfile_r ); }
468 { LogControlImpl::instance().logfile( logfile_r, mode_r ); }
471 {
return LogControlImpl::instance().getLineWriter(); }
474 { LogControlImpl::instance().setLineWriter( writer_r ); }
477 { LogControlImpl::instance().setLineFormater( formater_r ); }
480 { LogControlImpl::instance().setLineWriter( shared_ptr<LineWriter>() ); }
491 { LogControlImpl::instance().excessive(
true ); }
493 { LogControlImpl::instance().excessive(
false ); }
502 return str << LogControlImpl::instance();