You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

108 lines
2.2 KiB

/**
* @file sink.h
*
* Defines classes for log sinks (i.e. outputs)
*/
#pragma once
#include <ostream>
#include <fstream>
namespace l3pp {
/**
* Base class for a logging sink. It can only log some log entry to which some
* formatting is applied (see Formatter). A Sink may be given a log level,
* which filters out all entries below that level. By default is logs all
* entries.
*/
class Sink {
LogLevel level;
FormatterPtr formatter;
virtual void logEntry(std::string const& entry) const = 0;
public:
Sink() : level(LogLevel::ALL), formatter(std::make_shared<Formatter>()) {
}
Sink(FormatterPtr formatter) : level(LogLevel::ALL), formatter(formatter) {
}
/**
* Default destructor.
*/
virtual ~Sink() {}
LogLevel getLevel() const {
return level;
}
void setLevel(LogLevel level) {
this->level = level;
}
FormatterPtr getFormatter() const {
return formatter;
}
void setFormatter(FormatterPtr formatter) {
this->formatter = formatter;
}
/**
* Logs the given message with context info
*/
void log(EntryContext const& context, std::string const& message) const;
};
typedef std::shared_ptr<Sink> SinkPtr;
/**
* Logging sink that wraps an arbitrary `std::ostream`.
* It is meant to be used for streams like `std::cout` or `std::cerr`.
*/
class StreamSink: public Sink {
/// Output stream.
mutable std::ostream os;
void logEntry(std::string const& entry) const override {
os << entry << std::flush;
}
explicit StreamSink(std::ostream& _os) :
os(_os.rdbuf()) {}
public:
/**
* Create a StreamSink from some output stream.
* @param os Output stream.
*/
static SinkPtr create(std::ostream& os) {
return SinkPtr(new StreamSink(os));
}
};
/**
* Logging sink for file output.
*/
class FileSink: public Sink {
/// File output stream.
mutable std::ofstream os;
void logEntry(std::string const& entry) const override {
os << entry << std::flush;
}
explicit FileSink(const std::string& filename) :
os(filename, std::ios::out) {}
public:
/**
* Create a FileSink that logs to the specified file.
* The file is truncated upon construction.
* @param filename
*/
static SinkPtr create(const std::string& filename) {
return SinkPtr(new FileSink(filename));
}
};
}