@@ -39,8 +39,10 @@ class Sink {
3939 std::ostream *ostream;
4040 logger::Level flush_level;
4141
42- Sink (std::string logger_name, bool skip_prefix = false )
43- : logger_name(std::move(logger_name)), skip_prefix(skip_prefix) {
42+ Sink (std::string logger_name, bool skip_prefix = false ,
43+ bool skip_linebreak = false )
44+ : logger_name(std::move(logger_name)), skip_prefix(skip_prefix),
45+ skip_linebreak (skip_linebreak) {
4446 ostream = nullptr ;
4547 flush_level = logger::Level::ERR;
4648 }
@@ -56,6 +58,7 @@ class Sink {
5658 private:
5759 std::string logger_name;
5860 bool skip_prefix;
61+ bool skip_linebreak;
5962 std::mutex output_mutex;
6063 const char *error_prefix = " Log message syntax error: " ;
6164
@@ -83,7 +86,9 @@ class Sink {
8386 }
8487 }
8588 }
86- buffer << " \n " ;
89+ if (!skip_linebreak) {
90+ buffer << " \n " ;
91+ }
8792 }
8893
8994 template <typename Arg, typename ... Args>
@@ -129,14 +134,15 @@ class Sink {
129134
130135class StdoutSink : public Sink {
131136 public:
132- StdoutSink (std::string logger_name, bool skip_prefix = false )
133- : Sink(std::move(logger_name), skip_prefix) {
137+ StdoutSink (std::string logger_name, bool skip_prefix = false ,
138+ bool skip_linebreak = false )
139+ : Sink(std::move(logger_name), skip_prefix, skip_linebreak) {
134140 this ->ostream = &std::cout;
135141 }
136142
137143 StdoutSink (std::string logger_name, Level flush_lvl,
138- bool skip_prefix = false )
139- : StdoutSink(std::move(logger_name), skip_prefix) {
144+ bool skip_prefix = false , bool skip_linebreak = false )
145+ : StdoutSink(std::move(logger_name), skip_prefix, skip_linebreak ) {
140146 this ->flush_level = flush_lvl;
141147 }
142148
@@ -145,13 +151,15 @@ class StdoutSink : public Sink {
145151
146152class StderrSink : public Sink {
147153 public:
148- StderrSink (std::string logger_name, bool skip_prefix = false )
149- : Sink(std::move(logger_name), skip_prefix) {
154+ StderrSink (std::string logger_name, bool skip_prefix = false ,
155+ bool skip_linebreak = false )
156+ : Sink(std::move(logger_name), skip_prefix, skip_linebreak) {
150157 this ->ostream = &std::cerr;
151158 }
152159
153- StderrSink (std::string logger_name, Level flush_lvl, bool skip_prefix)
154- : StderrSink(std::move(logger_name), skip_prefix) {
160+ StderrSink (std::string logger_name, Level flush_lvl, bool skip_prefix,
161+ bool skip_linebreak)
162+ : StderrSink(std::move(logger_name), skip_prefix, skip_linebreak) {
155163 this ->flush_level = flush_lvl;
156164 }
157165
@@ -161,8 +169,8 @@ class StderrSink : public Sink {
161169class FileSink : public Sink {
162170 public:
163171 FileSink (std::string logger_name, filesystem::path file_path,
164- bool skip_prefix = false )
165- : Sink(std::move(logger_name), skip_prefix) {
172+ bool skip_prefix = false , bool skip_linebreak = false )
173+ : Sink(std::move(logger_name), skip_prefix, skip_linebreak ) {
166174 ofstream = std::ofstream (file_path);
167175 if (!ofstream.good ()) {
168176 std::stringstream ss;
@@ -174,8 +182,10 @@ class FileSink : public Sink {
174182 }
175183
176184 FileSink (std::string logger_name, filesystem::path file_path,
177- Level flush_lvl, bool skip_prefix = false )
178- : FileSink(std::move(logger_name), std::move(file_path), skip_prefix) {
185+ Level flush_lvl, bool skip_prefix = false ,
186+ bool skip_linebreak = false )
187+ : FileSink(std::move(logger_name), std::move(file_path), skip_prefix,
188+ skip_linebreak) {
179189 this ->flush_level = flush_lvl;
180190 }
181191
@@ -188,14 +198,17 @@ class FileSink : public Sink {
188198inline std::unique_ptr<Sink> sink_from_str (std::string logger_name,
189199 std::string name,
190200 filesystem::path file_path = " " ,
191- bool skip_prefix = false ) {
201+ bool skip_prefix = false ,
202+ bool skip_linebreak = false ) {
192203 if (name == " stdout" && file_path.empty ()) {
193- return std::make_unique<logger::StdoutSink>(logger_name, skip_prefix);
204+ return std::make_unique<logger::StdoutSink>(logger_name, skip_prefix,
205+ skip_linebreak);
194206 } else if (name == " stderr" && file_path.empty ()) {
195- return std::make_unique<logger::StderrSink>(logger_name, skip_prefix);
207+ return std::make_unique<logger::StderrSink>(logger_name, skip_prefix,
208+ skip_linebreak);
196209 } else if (name == " file" && !file_path.empty ()) {
197210 return std::make_unique<logger::FileSink>(logger_name, file_path,
198- skip_prefix);
211+ skip_prefix, skip_linebreak );
199212 }
200213
201214 throw std::invalid_argument (
0 commit comments