Belle II Software development
LogConnectionConsole Class Referencefinal

Implements a log connection to an IO Stream. More...

#include <LogConnectionConsole.h>

Inheritance diagram for LogConnectionConsole:
LogConnectionBase

Public Member Functions

 LogConnectionConsole (int outputFD, bool color)
 Constructor.
 
 LogConnectionConsole (int outputFD)
 Constructor which automatically enables color if the file descriptor is a terminal and supports colors.
 
 ~LogConnectionConsole () override
 Destructor.
 
bool sendMessage (const LogMessage &message) override
 Sends a log message.
 
void write (const std::string &message)
 Send a preformatted string message to the connected output.
 
bool isConnected () override
 Returns true if the connection to the io stream could be established.
 
void finalizeOnAbort () override
 Make sure output is flushed on abort.
 

Static Public Member Functions

static bool terminalSupportsColors (int fileDescriptor)
 Returns true if the given file descriptor is a tty and supports colors.
 
static bool getPythonLoggingEnabled ()
 Check whether console logging via python is enabled.
 
static void setPythonLoggingEnabled (bool enabled)
 Set whether console logging via pyhthon is enabled.
 
static bool getEscapeNewlinesEnabled ()
 Check whether we want to escape newlines on console.
 
static void setEscapeNewlinesEnabled (bool enabled)
 Set whether we want to escape newlines on console.
 

Private Attributes

int m_fd
 The output stream used for sending the log message.
 
bool m_color
 Flag for color output.
 

Static Private Attributes

static bool s_pythonLoggingEnabled {false}
 Flag to indicate whether log messages should be sent to python sys.stdout.
 
static bool s_escapeNewlinesEnabled {false}
 Flag to indicate whether newlines should be replaced by '
' in the output.
 

Detailed Description

Implements a log connection to an IO Stream.

Inherits from the abstract base class LogConnectionBase.

Definition at line 24 of file LogConnectionConsole.h.

Constructor & Destructor Documentation

◆ LogConnectionConsole() [1/2]

LogConnectionConsole ( int  outputFD,
bool  color 
)

Constructor.

Parameters
outputFDThe output file descriptor to write to
colorwhether color should be used for output

Definition at line 23 of file LogConnectionConsole.cc.

23 :
24 m_fd(dup(outputFD)), m_color(color)
25{
26 // check fd
27 if (m_fd < 0) throw std::runtime_error(std::string("Error duplicating file descriptor: ") + std::strerror(errno));
28}
bool m_color
Flag for color output.
int m_fd
The output stream used for sending the log message.

◆ LogConnectionConsole() [2/2]

LogConnectionConsole ( int  outputFD)
inlineexplicit

Constructor which automatically enables color if the file descriptor is a terminal and supports colors.

Parameters
outputFDThe output file descriptor to write to.

Definition at line 35 of file LogConnectionConsole.h.

35: LogConnectionConsole(outputFD, terminalSupportsColors(outputFD)) {}
LogConnectionConsole(int outputFD, bool color)
Constructor.
static bool terminalSupportsColors(int fileDescriptor)
Returns true if the given file descriptor is a tty and supports colors.

◆ ~LogConnectionConsole()

~LogConnectionConsole ( )
override

Destructor.

Definition at line 30 of file LogConnectionConsole.cc.

31{
32 if (m_fd > 0) close(m_fd);
33}

Member Function Documentation

◆ finalizeOnAbort()

void finalizeOnAbort ( )
overridevirtual

Make sure output is flushed on abort.

Reimplemented from LogConnectionBase.

Definition at line 99 of file LogConnectionConsole.cc.

100{
101 // If python logging is enabled we need to give jupyter some time to flush
102 // the output as this happens only in the output thread. Seems flushing again is fine :D
104 boost::python::import("sys").attr("stdout").attr("flush")();
105 }
106}
static bool getPythonLoggingEnabled()
Check whether console logging via python is enabled.

◆ getEscapeNewlinesEnabled()

static bool getEscapeNewlinesEnabled ( )
inlinestatic

Check whether we want to escape newlines on console.

Definition at line 60 of file LogConnectionConsole.h.

static bool s_escapeNewlinesEnabled
Flag to indicate whether newlines should be replaced by ' ' in the output.

◆ getPythonLoggingEnabled()

static bool getPythonLoggingEnabled ( )
inlinestatic

Check whether console logging via python is enabled.

Definition at line 56 of file LogConnectionConsole.h.

56{ return s_pythonLoggingEnabled; }
static bool s_pythonLoggingEnabled
Flag to indicate whether log messages should be sent to python sys.stdout.

◆ isConnected()

bool isConnected ( )
overridevirtual

Returns true if the connection to the io stream could be established.

Implements LogConnectionBase.

Definition at line 35 of file LogConnectionConsole.cc.

36{
37 return s_pythonLoggingEnabled || m_fd >= 0;
38}

◆ sendMessage()

bool sendMessage ( const LogMessage message)
overridevirtual

Sends a log message.

Parameters
messageThe log message object.
Returns
true if the message could be send.

Implements LogConnectionBase.

Definition at line 65 of file LogConnectionConsole.cc.

66{
67 if (!isConnected()) return false;
68 // format message
69 std::stringstream stream;
70 if (m_color) {
71 const std::string color_str[] = {
72 "\x1b[32m", // Debug : green
73 "", // Info : terminal default
74 "\x1b[34m", // Result : blue
75 "\x1b[33m", // Warning: yellow
76 "\x1b[31m", // Error : red
77 "\x1b[07m\x1b[31m" // Fatal : red reversed
78 };
79 const std::string& c{color_str[message.getLogLevel()]};
80 stream << c;
81 }
82 stream << message;
83 std::string messagestr = stream.str();
85 // remove trailing whitespace
86 boost::trim_right_if(messagestr, boost::is_any_of(" \t\n\r"));
87 // escape all remaining newlines
88 boost::replace_all(messagestr, "\n", "\\n");
89 // and make sure we end in an actual newline
90 messagestr += "\n";
91 }
92 if (m_color) {
93 messagestr += "\x1b[m";
94 }
95 write(messagestr);
96 return true;
97}
bool isConnected() override
Returns true if the connection to the io stream could be established.
void write(const std::string &message)
Send a preformatted string message to the connected output.

◆ setEscapeNewlinesEnabled()

static void setEscapeNewlinesEnabled ( bool  enabled)
inlinestatic

Set whether we want to escape newlines on console.

Definition at line 62 of file LogConnectionConsole.h.

62{ s_escapeNewlinesEnabled = enabled; }

◆ setPythonLoggingEnabled()

static void setPythonLoggingEnabled ( bool  enabled)
inlinestatic

Set whether console logging via pyhthon is enabled.

Definition at line 58 of file LogConnectionConsole.h.

58{ s_pythonLoggingEnabled = enabled; }

◆ terminalSupportsColors()

bool terminalSupportsColors ( int  fileDescriptor)
static

Returns true if the given file descriptor is a tty and supports colors.

Definition at line 40 of file LogConnectionConsole.cc.

41{
42 //enable color for TTYs with color support (list taken from gtest)
43 const bool isTTY = isatty(fileDescriptor);
44 const char* term = getenv("TERM");
45 const std::string termName = term ? term : "";
46 const bool useColor = isTTY and
47 (termName == "xterm" or termName == "xterm-color" or termName == "xterm-256color" or
48 termName == "sceen" or termName == "screen-256color" or termName == "tmux" or
49 termName == "tmux-256color" or termName == "rxvt-unicode" or
50 termName == "rxvt-unicode-256color" or termName == "linux" or termName == "cygwin");
51 return useColor;
52}

◆ write()

void write ( const std::string &  message)

Send a preformatted string message to the connected output.

Definition at line 54 of file LogConnectionConsole.cc.

55{
57 auto pymessage = boost::python::import("sys").attr("stdout");
58 pymessage.attr("write")(message);
59 pymessage.attr("flush")();
60 } else {
61 ::write(m_fd, message.data(), message.size());
62 }
63}

Member Data Documentation

◆ m_color

bool m_color
private

Flag for color output.

Definition at line 67 of file LogConnectionConsole.h.

◆ m_fd

int m_fd
private

The output stream used for sending the log message.

Definition at line 66 of file LogConnectionConsole.h.

◆ s_escapeNewlinesEnabled

bool s_escapeNewlinesEnabled {false}
staticprivate

Flag to indicate whether newlines should be replaced by '
' in the output.

Definition at line 69 of file LogConnectionConsole.h.

◆ s_pythonLoggingEnabled

bool s_pythonLoggingEnabled {false}
staticprivate

Flag to indicate whether log messages should be sent to python sys.stdout.

Definition at line 68 of file LogConnectionConsole.h.


The documentation for this class was generated from the following files: