18#include <zypp-core/base/Logger.h>
19#include <zypp-core/base/LogControl.h>
20#include <zypp-core/base/ProfilingFormater.h>
21#include <zypp-core/base/String.h>
22#include <zypp-core/Date.h>
23#include <zypp-core/TriBool.h>
24#include <zypp-core/AutoDispose.h>
27#include <zypp-core/zyppng/io/Socket>
28#include <zypp-core/zyppng/io/SockAddr>
29#include <zypp-core/zyppng/base/EventLoop>
30#include <zypp-core/zyppng/base/EventDispatcher>
31#include <zypp-core/zyppng/base/Timer>
32#include <zypp-core/zyppng/base/private/linuxhelpers_p.h>
33#include <zypp-core/zyppng/thread/Wakeup>
34#include <zypp-core/zyppng/base/private/threaddata_p.h>
35#include <zypp-core/zyppng/base/SocketNotifier>
71 std::this_thread::yield();
112 if (
_thread.get_id() != std::this_thread::get_id() )
131 _thread = std::thread( [
this] () {
139 zyppng::blockAllSignalsForCurrentThread();
141 zyppng::ThreadData::current().setName(
"Zypp-Log");
143 auto ev = zyppng::EventLoop::create();
147 std::vector<zyppng::Socket::Ptr>
clients;
150 server->bind( std::make_shared<zyppng::UnixSockAddr>(
sockPath(),
true ) );
154 server->connectFunc( &zyppng::Socket::sigIncomingConnection, [&](){
162 cl->connectFunc( &zyppng::Socket::sigReadyRead, [
this,
sock =
cl.get() ](){
163 auto writer = getLineWriter();
164 if ( !writer ) return;
165 while ( sock->canReadLine() ) {
166 auto br = sock->readLine();
167 writer->writeOut( std::string( br.data(), br.size() - 1 ) );
172 cl->connectFunc( &zyppng::Socket::sigDisconnected, [&
clients,
sock = std::weak_ptr(
cl)](){
173 auto lock =
sock.lock();
177 auto idx = std::find_if(
clients.begin(),
clients.end(), [lock](
const auto &
s ){ return lock.get() == s.get(); } );
183 stopNotifyWatch->connectFunc( &zyppng::SocketNotifier::sigActivated, [&
ev](
const auto &,
auto ) {
192 for (
auto &sock : clients ){
193 auto br = sock->readLine();
194 while ( !br.empty() ) {
195 if ( br.back () ==
'\n' )
196 writer->writeOut( std::string( br.data(), br.size() - 1 ) );
198 writer->writeOut( std::string( br.data(), br.size() ) );
200 br = sock->readLine();
215 boost::shared_ptr<log::LineWriter> _lineWriter{
nullptr };
223 LogThread::instance();
245 zyppng::UnixSockAddr
addr( LogThread::sockPath(),
true );
246 return zyppng::trySocketConnection( _sockFD,
addr, 100 );
253 if ( inPushMessage ) {
261 inPushMessage =
true;
264 if ( std::this_thread::get_id() == LogThread::instance().threadId() ) {
265 auto writer = LogThread::instance().getLineWriter();
271 if(!ensureConnection())
274 if ( msg.back() !=
'\n' )
278 while (
written < msg.size() ) {
292 bool inPushMessage =
false;
307 static constexpr std::string_view
OO {
"\033[0m" };
308 static constexpr std::string_view
WH {
"\033[37;40m" };
309 static constexpr std::string_view
CY {
"\033[36;40m" };
310 static constexpr std::string_view
YE {
"\033[33;1;40m" };
311 static constexpr std::string_view
GR {
"\033[32;40m" };
312 static constexpr std::string_view
RE {
"\033[31;1;40m" };
313 static constexpr std::string_view
MA {
"\033[35;40m" };
315 unsigned TraceLeave::_depth = 1;
387 std::ofstream *
fstr = 0;
388 _outs.reset( (
fstr =
new std::ofstream(
file_r.asString().c_str(), std::ios_base::app )) );
389 fstr->rdbuf()->pubsetbuf(0,0);
447 std::streamsize
xsputn(
const char *
s, std::streamsize
n )
override
467 for (
int i = 0;
i <
n; ++
i, ++
c )
585 return impl ?
impl->hideThreadName() :
false;
598 return impl ?
impl->_logToPPIDMode :
false;
665 ret <<
"---<RESET LOGSTREAM FROM FAILED STATE]" << endl;
698 if (
getenv(
"ZYPP_LOGFILE") )
701 if (
getenv(
"ZYPP_PROFILING") )
758 return str <<
"LogControlImpl";
807 return impl->isExcessive();
814 using logger::LogControlImpl;
826 static char hostname[1024];
828 std::string now(
Date::now().form(
"%Y-%m-%d %H:%M:%S" ) );
841 ret =
str::form(
"%s <%d> %s(%d) [%s] %s(%s):%d {T:%s} %s",
847 zyppng::ThreadData::current().name().c_str(),
884 return impl->getLineWriter();
949 impl->excessive(
true );
956 impl->excessive(
false );
std::once_flag flagReadEnvAutomatically
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
void reset()
Reset to default Ctor values.
static Date now()
Return the current time.
LogClient(LogClient &&)=delete
LogClient(const LogClient &)=delete
LogClient & operator=(const LogClient &)=delete
LogClient & operator=(LogClient &&)=delete
void pushMessage(std::string msg)
boost::shared_ptr< log::LineWriter > getLineWriter()
LogThread & operator=(const LogThread &)=delete
zyppng::Wakeup _stopSignal
LogThread(const LogThread &)=delete
std::thread::id threadId()
LogThread(LogThread &&)=delete
LogThread & operator=(LogThread &&)=delete
static LogThread & instance()
static std::string sockPath()
boost::shared_ptr< log::LineWriter > _lineWriter
void setLineWriter(boost::shared_ptr< log::LineWriter > writer)
std::atomic_flag _atomicLock
Maintain logfile related options.
friend std::ostream & operator<<(std::ostream &str, const LogControl &obj)
shared_ptr< LineWriter > getLineWriter() const
Get the current LineWriter.
void setLineWriter(const shared_ptr< LineWriter > &writer_r)
Assign a LineWriter.
void emergencyShutdown()
will cause the log thread to exit and flush all sockets
void logToStdErr()
Log to std::err.
void logRawLine(std::string &&line)
will push a line to the logthread without formatting it
void logNothing()
Turn off logging.
static void notifyFork()
This will completely disable logging.
void setLineFormater(const shared_ptr< LineFormater > &formater_r)
Assign a LineFormater.
void enableLogForwardingMode(bool enable=true)
void logfile(const Pathname &logfile_r)
Set path for the logfile.
int overflow(int ch=EOF) override
std::streamsize xsputn(const char *s, std::streamsize n) override
Loglinebuf(const Loglinebuf &)=default
Loglinebuf(std::string group_r, LogLevel level_r)
Loglinebuf(Loglinebuf &&)=default
Loglinebuf & operator=(const Loglinebuf &)=default
void tagSet(const char *fil_r, const char *fnc_r, int lne_r)
virtual int writeout(const char *s, std::streamsize n)
Loglinebuf & operator=(Loglinebuf &&)=default
Loglinestream(const std::string &group_r, LogLevel level_r)
Loglinestream(const Loglinestream &)=delete
Loglinestream & operator=(const Loglinestream &)=delete
std::ostream & getStream(const char *fil_r, const char *fnc_r, int lne_r)
Loglinestream(Loglinestream &&)=delete
Loglinestream & operator=(Loglinestream &&)=delete
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
String related utilities and Regular expression matching.
int & logControlValidFlag()
void putStream(const std::string &group_r, LogLevel level_r, const char *file_r, const char *func_r, int line_r, const std::string &buffer_r)
That's what Loglinebuf calls.
LogLevel
Definition of log levels.
@ E_XXX
Excessive logging.
std::ostream & getStream(const char *group_r, LogLevel level_r, const char *file_r, const char *func_r, const int line_r)
Return a log stream to write on.
static constexpr std::string_view WH
std::string tracestr(char tag_r, unsigned depth_r, const char *file_r, const char *fnc_r, int line_r)
static constexpr std::string_view OO
static constexpr std::string_view YE
static constexpr std::string_view CY
static constexpr std::string_view GR
static constexpr std::string_view MA
static constexpr std::string_view RE
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Easy-to use interface to the ZYPP dependency resolver.
constexpr bool always_false_v
constexpr std::string_view ZYPP_MAIN_THREAD_NAME("Zypp-main")
LogControl implementation (thread_local Singleton).
void putRawLine(std::string &&line)
void setLineWriter(const shared_ptr< LogControl::LineWriter > &writer_r)
NULL _lineWriter indicates no loggin.
static LogControlImpl * instance()
The LogControlImpl singleton.
static bool instanceHideThreadName()
LogControlImpl(LogControlImpl &&)=delete
LogControlImpl & operator=(const LogControlImpl &)=delete
std::ostream & operator<<(std::ostream &str, const LogControlImpl &)
Stream output.
LogControlImpl()
Singleton ctor.
static void instanceHideThreadName(bool onOff_r)
static void instanceSetLogToPPID(bool onOff_r)
StreamTable _streamtable
one streambuffer per group and level
static bool instanceLogToPPID()
Hint for formatter wether we forward all logs to a parents log.
LogControlImpl(const LogControlImpl &)=delete
void excessive(bool onOff_r)
std::map< std::string, StreamSet > StreamTable
bool _logToPPIDMode
Hint for formatter to use the PPID and always show the thread name.
void setLineFormater(const shared_ptr< LogControl::LineFormater > &format_r)
Assert _lineFormater is not NULL.
std::ostream & getStream(const std::string &group_r, LogLevel level_r, const char *file_r, const char *func_r, const int line_r)
Provide the log stream to write (logger interface)
void logfile(const Pathname &logfile_r, mode_t mode_r=0640)
shared_ptr< LogControl::LineWriter > getLineWriter() const
std::map< LogLevel, StreamPtr > StreamSet
shared_ptr< LogControl::LineFormater > _lineFormater
LogControlImpl & operator=(LogControlImpl &&)=delete
bool hideThreadName() const
Hint for Formater whether to hide the thread name.
void putStream(const std::string &group_r, LogLevel level_r, const char *file_r, const char *func_r, int line_r, const std::string &message_r)
Format and write out a logline from Loglinebuf.
void hideThreadName(bool onOff_r)
zyppng::Socket::Ptr _sock
TriBool _hideThreadName
Hint for Formater whether to hide the thread name.
Osd(std::ostream &, int=0)
Osd & operator<<(Tp &&val)
FileLineWriter(const Pathname &file_r, mode_t mode_r=0)
Base class for ostream based LineWriter.