feat(logger): add timestamp support to log messages
This commit is contained in:
+3
-2
@@ -16,7 +16,8 @@ BUILD_DIR := $(ROOT_DIR)/build
|
|||||||
|
|
||||||
TARGET := $(BUILD_DIR)/liblogger.so
|
TARGET := $(BUILD_DIR)/liblogger.so
|
||||||
|
|
||||||
SRC := src/logger.cpp
|
SRC := src/logger.cpp \
|
||||||
|
src/time_utils.cpp
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all clean
|
.PHONY: all clean
|
||||||
@@ -31,7 +32,7 @@ $(TARGET): $(SRC)
|
|||||||
$(CC) \
|
$(CC) \
|
||||||
$(CXXFLAGS) \
|
$(CXXFLAGS) \
|
||||||
-shared \
|
-shared \
|
||||||
$< \
|
$^ \
|
||||||
-o $@ \
|
-o $@ \
|
||||||
$(LDFLAGS)
|
$(LDFLAGS)
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "time_utils.hpp"
|
||||||
|
|
||||||
namespace logger {
|
namespace logger {
|
||||||
|
|
||||||
Logger::Logger(const std::string &fileName, LogLevel defaultLevel)
|
Logger::Logger(const std::string &fileName, LogLevel defaultLevel)
|
||||||
@@ -10,13 +12,16 @@ Logger::Logger(const std::string &fileName, LogLevel defaultLevel)
|
|||||||
Logger::~Logger() = default;
|
Logger::~Logger() = default;
|
||||||
|
|
||||||
core::Status Logger::writeMessage(LogLevel level, const std::string &message) {
|
core::Status Logger::writeMessage(LogLevel level, const std::string &message) {
|
||||||
|
// std::ios::app — режим добавления в конец файла
|
||||||
|
// без удаления уже существующих записей.
|
||||||
std::ofstream stream(fileName_, std::ios::app);
|
std::ofstream stream(fileName_, std::ios::app);
|
||||||
|
|
||||||
if (!stream.is_open()) {
|
if (!stream.is_open()) {
|
||||||
return core::Status::Failure("Unable to open log file: " + fileName_);
|
return core::Status::Failure("Unable to open log file: " + fileName_);
|
||||||
}
|
}
|
||||||
|
|
||||||
stream << "[" << level.toString() << "] " << message << '\n';
|
stream << '[' << time::getCurrentTimestamp() << "] [" << level.toString()
|
||||||
|
<< "] " << message << '\n';
|
||||||
|
|
||||||
if (!stream.good()) {
|
if (!stream.good()) {
|
||||||
return core::Status::Failure("Failed to write to log file: " + fileName_);
|
return core::Status::Failure("Failed to write to log file: " + fileName_);
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
#include "time_utils.hpp"
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
#include <ctime>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
|
namespace logger::time {
|
||||||
|
|
||||||
|
std::string getCurrentTimestamp() {
|
||||||
|
const auto now = std::chrono::system_clock::now();
|
||||||
|
const std::time_t currentTime = std::chrono::system_clock::to_time_t(now);
|
||||||
|
|
||||||
|
std::tm localTime{};
|
||||||
|
|
||||||
|
#if defined(_WIN32)
|
||||||
|
localtime_s(&localTime, ¤tTime);
|
||||||
|
#else
|
||||||
|
localtime_r(¤tTime, &localTime);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
std::ostringstream stream;
|
||||||
|
|
||||||
|
stream << std::put_time(&localTime, "%Y-%m-%d %H:%M:%S");
|
||||||
|
|
||||||
|
return stream.str();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace logger::time
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace logger::time {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Возвращает текущее локальное время.
|
||||||
|
*
|
||||||
|
* Время возвращается в формате:
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
* YYYY-MM-DD HH:MM:SS
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @return Текущее локальное время в виде строки.
|
||||||
|
*/
|
||||||
|
std::string getCurrentTimestamp();
|
||||||
|
|
||||||
|
} // namespace logger::time
|
||||||
+2
-1
@@ -25,7 +25,8 @@ LOGGER_TEST_SRC := core/logger_test.cpp
|
|||||||
SCOPED_FILE_TEST_SRC := helpers/scoped_file_test.cpp
|
SCOPED_FILE_TEST_SRC := helpers/scoped_file_test.cpp
|
||||||
|
|
||||||
|
|
||||||
LOGGER_SRC := $(ROOT_DIR)/logger/src/logger.cpp
|
LOGGER_SRC := $(ROOT_DIR)/logger/src/logger.cpp \
|
||||||
|
$(ROOT_DIR)/logger/src/time_utils.cpp
|
||||||
|
|
||||||
|
|
||||||
.PHONY: all test clean
|
.PHONY: all test clean
|
||||||
|
|||||||
Reference in New Issue
Block a user