23 #include <logging/fd_redirect.h> 24 #include <logging/logger.h> 25 #include <boost/bind.hpp> 48 : io_service_work_(io_service_), stream_(io_service_),
49 logger_(logger), log_name_(logname), log_level_(log_level)
52 old_fd_dup_ = dup(fd);
54 if (pipe(log_pipe) == -1) {
55 throw Exception(errno,
"Failed to create log pipe");
58 if (dup2(log_pipe[1], fd) == -1) {
59 throw Exception(errno,
"Failed to dup2 pipe to fd");
62 log_fd_ = dup(log_pipe[0]);
63 stream_.assign(log_fd_);
69 io_service_thread_ = std::thread([
this]() { this->io_service_.run(); });
71 start_log(log_name_.c_str(), log_level_, stream_, buffer_);
79 io_service_thread_.join();
81 dup2(old_fd_dup_, old_fd_);
89 LogFileDescriptorToLog::start_log(
const char *logname,
Logger::LogLevel log_level,
90 boost::asio::posix::stream_descriptor &sd, boost::asio::streambuf &buf)
92 boost::asio::async_read_until(sd, buf,
'\n',
94 &LogFileDescriptorToLog::handle_log_line,
this,
95 logname, log_level, boost::ref(sd), boost::ref(buf),
96 boost::asio::placeholders::error,
97 boost::asio::placeholders::bytes_transferred
103 LogFileDescriptorToLog::handle_log_line(
const char *logname,
Logger::LogLevel log_level,
104 boost::asio::posix::stream_descriptor &sd, boost::asio::streambuf &buf,
105 boost::system::error_code ec,
size_t bytes_read)
108 if (ec == boost::asio::error::eof) {
112 logger_->
log_error(logname,
"Failed to read log line %i (%s), continuing", ec.value(),
113 ec.message().c_str());
117 std::istream in_stream(&buf);
118 std::getline(in_stream, line);
119 logger_->
log(log_level, logname,
"%s", line.c_str());
121 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.