22 if (_message_started) {
38 if (_message_started) {
41 _message_started =
true;
42 get_buffer() << get_timestamp_and_thread() <<
" ";
47 get_buffer() <<
"[ERROR] ";
55 if (
s.find(
'\n') != std::string::npos) {
57 _message_started =
false;
64 _file_stream = std::make_unique<std::ofstream>(
filename, std::ios::out);
65 if (!_file_stream->is_open()) {
66 std::cerr <<
"Erro ao abrir arquivo de log: " <<
filename << std::endl;
69 _stream = _file_stream.get();
76 if (_file_stream && _file_stream->is_open()) {
77 _file_stream->close();
98 std::string
content = get_buffer().str();
102 (*_stream) <<
content << std::flush;
105 get_buffer().str(
"");
106 get_buffer().clear();
110 static std::ostringstream& get_buffer() {
111 thread_local std::ostringstream
buffer;
115 static std::string get_timestamp_and_thread() {
116 auto now = std::chrono::system_clock::now();
117 auto time_t = std::chrono::system_clock::to_time_t(
now);
118 auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
119 now.time_since_epoch()) % 1000;
121 std::ostringstream
oss;
122 oss <<
"[" << std::put_time(std::localtime(&
time_t),
"%H:%M:%S");
123 oss <<
"." << std::setfill(
'0') << std::setw(3) <<
ms.count();
128 static inline std::unique_ptr<std::ofstream> _file_stream;
129 static inline std::ostream* _stream = &std::cout;
132 bool _message_started;