Fix logging to files

This commit is contained in:
Robbert van der Helm
2020-03-07 18:58:23 +01:00
parent 50172aefbb
commit e5348fc5f7
2 changed files with 12 additions and 13 deletions
+9 -11
View File
@@ -18,16 +18,14 @@
constexpr char logging_file_environment_variable[] = "YABRIDGE_DEBUG_FILE"; constexpr char logging_file_environment_variable[] = "YABRIDGE_DEBUG_FILE";
/** /**
* The verbosity of the logging, defaults to `Logger::Verbosity::events` if * The verbosity of the logging, defaults to `Logger::Verbosity::basic`.
* `logging_file_environment_variable` has been set and
* `Logger::Verbosity::basic` otherwise.
* *
* @see Logger::Verbosity * @see Logger::Verbosity
*/ */
constexpr char logging_verbosity_environment_variable[] = constexpr char logging_verbosity_environment_variable[] =
"YABRIDGE_DEBUG_VERBOSITY"; "YABRIDGE_DEBUG_VERBOSITY";
Logger::Logger(std::ostream&& stream, Logger::Logger(std::shared_ptr<std::ostream> stream,
Verbosity verbosity_level, Verbosity verbosity_level,
std::string prefix) std::string prefix)
: stream(stream), verbosity(verbosity_level), prefix(prefix) {} : stream(stream), verbosity(verbosity_level), prefix(prefix) {}
@@ -49,11 +47,13 @@ Logger Logger::create_from_environment(std::string prefix) {
// If `file` points to a valid location then use create/truncate the // If `file` points to a valid location then use create/truncate the
// file and write all of the logs there, otherwise use STDERR // file and write all of the logs there, otherwise use STDERR
std::ofstream log_file(file_path, std::fstream::out); auto log_file = std::make_shared<std::ofstream>(
if (log_file.is_open()) { file_path, std::fstream::out | std::fstream::app);
return Logger(std::move(log_file), verbosity_level, prefix); if (log_file->is_open()) {
return Logger(log_file, verbosity_level, prefix);
} else { } else {
return Logger(std::move(std::cerr), verbosity_level, prefix); return Logger(std::shared_ptr<std::ostream>(&std::cerr, [](auto) {}),
verbosity_level, prefix);
} }
} }
@@ -77,7 +77,5 @@ void Logger::log(const std::string& message) {
// stream to prevent two messages from being put on the same row // stream to prevent two messages from being put on the same row
formatted_message << std::endl; formatted_message << std::endl;
// No flush. Should technically be necessary, but it decreases throughput by *stream << formatted_message.str() << std::flush;
// a lot and it seems to work fine without.
stream << formatted_message.str();
} }
+3 -2
View File
@@ -16,6 +16,7 @@
#pragma once #pragma once
#include <memory>
#include <ostream> #include <ostream>
/** /**
@@ -63,7 +64,7 @@ class Logger {
* @param prefix An optional prefix for the logger. Useful for differentiate * @param prefix An optional prefix for the logger. Useful for differentiate
* messages coming from the Wine VST host. * messages coming from the Wine VST host.
*/ */
Logger(std::ostream&& stream, Logger(std::shared_ptr<std::ostream> stream,
Verbosity verbosity_level, Verbosity verbosity_level,
std::string prefix = ""); std::string prefix = "");
@@ -92,7 +93,7 @@ class Logger {
* The output stream to write the log messages to. Typically either STDERR * The output stream to write the log messages to. Typically either STDERR
* or a file stream. * or a file stream.
*/ */
std::ostream& stream; std::shared_ptr<std::ostream> stream;
/** /**
* The verbosity level of this logger instance. Based on this certain * The verbosity level of this logger instance. Based on this certain
* messages may or may not be shown. * messages may or may not be shown.