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
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							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));
							 | 
						|
									}
							 | 
						|
								};
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								
							 |