23 #include <logging/fd_redirect.h> 24 #include <logging/logger.h> 26 #include <boost/bind.hpp> 48 : io_service_work_(io_service_),
55 old_fd_dup_ = dup(fd);
57 if (pipe(log_pipe) == -1) {
58 throw Exception(errno,
"Failed to create log pipe");
61 if (dup2(log_pipe[1], fd) == -1) {
62 throw Exception(errno,
"Failed to dup2 pipe to fd");
65 log_fd_ = dup(log_pipe[0]);
66 stream_.assign(log_fd_);
72 io_service_thread_ = std::thread([
this]() { this->io_service_.run(); });
74 start_log(log_name_.c_str(), log_level_, stream_, buffer_);
81 io_service_thread_.join();
83 dup2(old_fd_dup_, old_fd_);
90 LogFileDescriptorToLog::start_log(
const char * logname,
92 boost::asio::posix::stream_descriptor &sd,
93 boost::asio::streambuf & buf)
95 boost::asio::async_read_until(sd,
98 boost::bind(&LogFileDescriptorToLog::handle_log_line,
104 boost::asio::placeholders::error,
105 boost::asio::placeholders::bytes_transferred));
109 LogFileDescriptorToLog::handle_log_line(
const char * logname,
111 boost::asio::posix::stream_descriptor &sd,
112 boost::asio::streambuf & buf,
113 boost::system::error_code ec,
117 if (ec == boost::asio::error::eof) {
122 "Failed to read log line %i (%s), continuing",
124 ec.message().c_str());
128 std::istream in_stream(&buf);
129 std::getline(in_stream, line);
130 logger_->
log(log_level, logname,
"%s", line.c_str());
132 start_log(logname, log_level, sd, buf);
Fawkes library namespace.
~LogFileDescriptorToLog()
Destructor.
Base class for exceptions in Fawkes.
virtual void log_error(const char *component, const char *format,...)=0
Log error message.
LogFileDescriptorToLog(int fd, Logger *logger, const char *logname, Logger::LogLevel log_level)
Constructor.
virtual void log(LogLevel level, const char *component, const char *format,...)
Log message of given log level.