From 223afbea401b1536d7cf852fb8ba1aa3c8629120 Mon Sep 17 00:00:00 2001 From: user Date: Sun, 19 Jul 2026 22:57:14 +0400 Subject: [PATCH] feat(logger): add timestamp support to log messages --- logger/Makefile | 5 +++-- logger/src/logger.cpp | 7 ++++++- logger/src/time_utils.cpp | 29 +++++++++++++++++++++++++++++ logger/src/time_utils.hpp | 20 ++++++++++++++++++++ tests/Makefile | 3 ++- 5 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 logger/src/time_utils.cpp create mode 100644 logger/src/time_utils.hpp diff --git a/logger/Makefile b/logger/Makefile index 5550633..282ca34 100644 --- a/logger/Makefile +++ b/logger/Makefile @@ -16,7 +16,8 @@ BUILD_DIR := $(ROOT_DIR)/build TARGET := $(BUILD_DIR)/liblogger.so -SRC := src/logger.cpp +SRC := src/logger.cpp \ + src/time_utils.cpp .PHONY: all clean @@ -31,7 +32,7 @@ $(TARGET): $(SRC) $(CC) \ $(CXXFLAGS) \ -shared \ - $< \ + $^ \ -o $@ \ $(LDFLAGS) diff --git a/logger/src/logger.cpp b/logger/src/logger.cpp index f0fe1c0..46b5dd6 100644 --- a/logger/src/logger.cpp +++ b/logger/src/logger.cpp @@ -2,6 +2,8 @@ #include +#include "time_utils.hpp" + namespace logger { Logger::Logger(const std::string &fileName, LogLevel defaultLevel) @@ -10,13 +12,16 @@ Logger::Logger(const std::string &fileName, LogLevel defaultLevel) Logger::~Logger() = default; core::Status Logger::writeMessage(LogLevel level, const std::string &message) { + // std::ios::app — режим добавления в конец файла + // без удаления уже существующих записей. std::ofstream stream(fileName_, std::ios::app); if (!stream.is_open()) { 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()) { return core::Status::Failure("Failed to write to log file: " + fileName_); diff --git a/logger/src/time_utils.cpp b/logger/src/time_utils.cpp new file mode 100644 index 0000000..79a69ce --- /dev/null +++ b/logger/src/time_utils.cpp @@ -0,0 +1,29 @@ +#include "time_utils.hpp" + +#include +#include +#include +#include + +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 diff --git a/logger/src/time_utils.hpp b/logger/src/time_utils.hpp new file mode 100644 index 0000000..c9f86bc --- /dev/null +++ b/logger/src/time_utils.hpp @@ -0,0 +1,20 @@ +#pragma once + +#include + +namespace logger::time { + +/** + * @brief Возвращает текущее локальное время. + * + * Время возвращается в формате: + * + * @code + * YYYY-MM-DD HH:MM:SS + * @endcode + * + * @return Текущее локальное время в виде строки. + */ +std::string getCurrentTimestamp(); + +} // namespace logger::time diff --git a/tests/Makefile b/tests/Makefile index 05961b8..e34455f 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -25,7 +25,8 @@ LOGGER_TEST_SRC := core/logger_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