@@ -2924,6 +2924,62 @@ static_assert(LOGIT_LEVEL_FATAL == static_cast<int>(logit::LogLevel::LOG_LVL_FAT
29242924#define LOGIT_WITH_LOGGER_AS (logger_index, logger_type, var_name ) \
29252925 if (auto * var_name = LOGIT_GET_LOGGER_AS ((logger_index), logger_type))
29262926
2927+ // / \brief Retrieves a read-only log-reader interface from a logger by index.
2928+ // / \param logger_index Index of logger.
2929+ // / \return Pointer to ILogReader, or nullptr if the backend does not implement it.
2930+ #define LOGIT_GET_LOG_READER (logger_index ) \
2931+ LOGIT_GET_LOGGER_AS ((logger_index), ::logit::ILogReader)
2932+
2933+ // / \brief Executes a code block when the logger backend supports ILogReader.
2934+ // / \param logger_index Index of logger.
2935+ // / \param var_name Variable name available inside the block.
2936+ #define LOGIT_WITH_LOG_READER (logger_index, var_name ) \
2937+ if (auto * var_name = LOGIT_GET_LOG_READER ((logger_index)))
2938+
2939+ // / \brief Reads a time-range of records from a backend that supports ILogReader.
2940+ // / \param logger_index Index of logger.
2941+ // / \param from_ms Inclusive start timestamp.
2942+ // / \param to_ms Exclusive end timestamp.
2943+ // / \param limit Maximum number of records (0 = unlimited).
2944+ // / \return Matching records, or empty vector if backend does not support reading.
2945+ #define LOGIT_READ_RANGE (logger_index, from_ms, to_ms, limit ) \
2946+ ([](int _idx, int64_t _from, int64_t _to, std::size_t _limit) { \
2947+ auto * _reader = LOGIT_GET_LOG_READER (_idx); \
2948+ return _reader \
2949+ ? _reader->read_range (_from, _to, _limit) \
2950+ : std::vector<::logit::LogRecordView>{}; \
2951+ }((logger_index), (from_ms), (to_ms), (limit)))
2952+
2953+ // / \brief Reads recent records from a backend that supports ILogReader.
2954+ // / \param logger_index Index of logger.
2955+ // / \param limit Maximum number of records (0 = unlimited).
2956+ // / \param period_ms Time window in milliseconds from now backward (0 = unlimited).
2957+ // / \param order Ascending or descending result order.
2958+ // / \return Matching records, or empty vector if backend does not support reading.
2959+ #define LOGIT_READ_RECENT (logger_index, limit, period_ms, order ) \
2960+ ([](int _idx, std::size_t _limit, int64_t _period_ms, ::logit::LogReadOrder _order) { \
2961+ auto * _reader = LOGIT_GET_LOG_READER (_idx); \
2962+ return _reader \
2963+ ? _reader->read_recent (_limit, _period_ms, _order) \
2964+ : std::vector<::logit::LogRecordView>{}; \
2965+ }((logger_index), (limit), (period_ms), (order)))
2966+
2967+ // / \brief Reads recent records in ascending order (oldest first).
2968+ // / \param logger_index Index of logger.
2969+ // / \param limit Maximum number of records (0 = unlimited).
2970+ // / \param period_ms Time window in milliseconds from now backward (0 = unlimited).
2971+ // / \return Matching records in ascending order, or empty vector if backend does not support reading.
2972+ #define LOGIT_READ_RECENT_ASC (logger_index, limit, period_ms ) \
2973+ LOGIT_READ_RECENT ((logger_index), (limit), (period_ms), ::logit::LogReadOrder::Ascending)
2974+
2975+ // / \brief Reads recent records in descending order (newest first).
2976+ // / \param logger_index Index of logger.
2977+ // / \param limit Maximum number of records (0 = unlimited).
2978+ // / \param period_ms Time window in milliseconds from now backward (0 = unlimited).
2979+ // / \return Matching records in descending order, or empty vector if backend does not support reading.
2980+ #define LOGIT_READ_RECENT_DESC (logger_index, limit, period_ms ) \
2981+ LOGIT_READ_RECENT ((logger_index), (limit), (period_ms), ::logit::LogReadOrder::Descending)
2982+
29272983// / \}
29282984
29292985#endif // LOGIT_LOG_MACROS_HPP_INCLUDED
0 commit comments