1
0
mirror of https://github.com/gabime/spdlog.git synced 2025-01-16 17:47:57 +00:00

Compare commits

...

6 Commits

Author SHA1 Message Date
gabime
7097f7a894 Updated stopwatch example to README.md 2020-08-29 03:50:48 +03:00
gabime
537fd7c4ba Added stopwatch example to README.md 2020-08-29 03:49:18 +03:00
gabime
d5048b8b0c Added stopwatch example to README.md 2020-08-29 03:48:24 +03:00
gabime
0348556aac Added stopwatch example to README.md 2020-08-29 03:46:29 +03:00
gabime
d6329b9dce Added some stopwatch tests 2020-08-29 03:25:16 +03:00
gabime
34f3d29d93 Added stopwatch support 2020-08-29 02:48:43 +03:00
5 changed files with 158 additions and 35 deletions

View File

@ -169,6 +169,20 @@ spdlog::flush_every(std::chrono::seconds(3));
```
---
#### Stopwatch
```c++
// Stopwatch support for spdlog
#include "spdlog/stopwatch.h"
void stopwatch_example()
{
spdlog::stopwatch sw;
spdlog::debug("Elapsed {}", sw);
spdlog::debug("Elapsed {:.3}", sw);
}
```
---
#### Log binary data in hex
```c++

View File

@ -13,6 +13,7 @@ void rotating_example();
void daily_example();
void async_example();
void binary_example();
void stopwatch_example();
void trace_example();
void multi_sink_example();
void user_defined_example();
@ -71,6 +72,7 @@ int main(int, char *[])
user_defined_example();
err_handler_example();
trace_example();
stopwatch_example();
custom_flags_example();
// Flush all *registered* loggers using a worker thread every 3 seconds.
@ -192,6 +194,16 @@ void trace_example()
SPDLOG_LOGGER_TRACE(logger, "another trace message");
}
// stopwatch example
#include "spdlog/stopwatch.h"
#include <thread>
void stopwatch_example()
{
spdlog::stopwatch sw;
std::this_thread::sleep_for(std::chrono::milliseconds(123));
spdlog::info("Stopwatch: {} seconds", sw);
}
// A logger with multiple sinks (stdout and file) - each with a different format and log level.
void multi_sink_example()
{

View File

@ -0,0 +1,61 @@
// Copyright(c) 2015-present, Gabi Melman & spdlog contributors.
// Distributed under the MIT License (http://opensource.org/licenses/MIT)
#pragma once
#include <spdlog/fmt/fmt.h>
// Stopwatch support for spdlog (using std::chrono::high_resolution_clock).
// Displays elapsed seconds since construction as double.
//
// Usage:
//
// spdlog::stopwatch sw;
// ...
// spdlog::debug("Elapsed: {} seconds", sw); => "Elapsed 0.005116733 seconds"
// spdlog::info("Elapsed: {:.6} seconds", sw); => "Elapsed 0.005163 seconds"
//
//
// If other units are needed (e.g. millis instead of double), include "fmt/chrono.h" and use "duration_cast<..>(sw.elapsed())":
//
// #include <fmt/chrono.h>
//..
// using std::chrono::duration_cast;
// using std::chrono::milliseconds;
// spdlog::info("Elapsed {}", duration_cast<milliseconds>(sw.elapsed())); => "Elapsed 5ms"
namespace spdlog {
class stopwatch
{
using clock = std::chrono::high_resolution_clock;
std::chrono::time_point<clock> start_tp_;
public:
stopwatch()
: start_tp_{clock::now()}
{}
std::chrono::duration<double> elapsed() const
{
return std::chrono::duration<double>(clock::now() - start_tp_);
}
void reset()
{
start_tp_ = clock ::now();
}
};
} // namespace spdlog
// Support for fmt formatting (e.g. "{:012.9}" or just "{}")
namespace fmt {
template<>
struct formatter<spdlog::stopwatch> : formatter<double>
{
template<typename FormatContext>
auto format(const spdlog::stopwatch &sw, FormatContext &ctx) -> decltype(ctx.out())
{
return formatter<double>::format(sw.elapsed().count(), ctx);
}
};
} // namespace fmt

View File

@ -1,46 +1,47 @@
cmake_minimum_required(VERSION 3.10)
project(spdlog_utests CXX)
if(NOT TARGET spdlog)
if (NOT TARGET spdlog)
# Stand-alone build
find_package(spdlog REQUIRED)
endif()
endif ()
include(../cmake/utils.cmake)
find_package(PkgConfig)
if(PkgConfig_FOUND)
if (PkgConfig_FOUND)
pkg_check_modules(systemd libsystemd)
endif()
endif ()
set(SPDLOG_UTESTS_SOURCES
test_file_helper.cpp
test_file_logging.cpp
test_daily_logger.cpp
test_misc.cpp
test_eventlog.cpp
test_pattern_formatter.cpp
test_async.cpp
test_registry.cpp
test_macros.cpp
utils.cpp
main.cpp
test_mpmc_q.cpp
test_dup_filter.cpp
test_fmt_helper.cpp
test_stdout_api.cpp
test_backtrace.cpp
test_create_dir.cpp
test_cfg.cpp
test_time_point.cpp)
test_file_helper.cpp
test_file_logging.cpp
test_daily_logger.cpp
test_misc.cpp
test_eventlog.cpp
test_pattern_formatter.cpp
test_async.cpp
test_registry.cpp
test_macros.cpp
utils.cpp
main.cpp
test_mpmc_q.cpp
test_dup_filter.cpp
test_fmt_helper.cpp
test_stdout_api.cpp
test_backtrace.cpp
test_create_dir.cpp
test_cfg.cpp
test_time_point.cpp
test_stopwatch.cpp)
if(NOT SPDLOG_NO_EXCEPTIONS)
if (NOT SPDLOG_NO_EXCEPTIONS)
list(APPEND SPDLOG_UTESTS_SOURCES test_errors.cpp)
endif()
endif ()
if(systemd_FOUND)
if (systemd_FOUND)
list(APPEND SPDLOG_UTESTS_SOURCES test_systemd.cpp)
endif()
endif ()
enable_testing()
@ -48,22 +49,22 @@ function(spdlog_prepare_test test_target spdlog_lib)
add_executable(${test_target} ${SPDLOG_UTESTS_SOURCES})
spdlog_enable_warnings(${test_target})
target_link_libraries(${test_target} PRIVATE ${spdlog_lib})
if(systemd_FOUND)
if (systemd_FOUND)
target_link_libraries(${test_target} PRIVATE ${systemd_LIBRARIES})
endif()
if(SPDLOG_SANITIZE_ADDRESS)
endif ()
if (SPDLOG_SANITIZE_ADDRESS)
spdlog_enable_sanitizer(${test_target})
endif()
endif ()
add_test(NAME ${test_target} COMMAND ${test_target})
set_tests_properties(${test_target} PROPERTIES RUN_SERIAL ON)
endfunction()
# The compiled library tests
if(SPDLOG_BUILD_TESTS OR SPDLOG_BUILD_ALL)
if (SPDLOG_BUILD_TESTS OR SPDLOG_BUILD_ALL)
spdlog_prepare_test(spdlog-utests spdlog::spdlog)
endif()
endif ()
# The header-only library version tests
if(SPDLOG_BUILD_TESTS_HO OR SPDLOG_BUILD_ALL)
if (SPDLOG_BUILD_TESTS_HO OR SPDLOG_BUILD_ALL)
spdlog_prepare_test(spdlog-utests-ho spdlog::spdlog_header_only)
endif()
endif ()

35
tests/test_stopwatch.cpp Normal file
View File

@ -0,0 +1,35 @@
#include "includes.h"
#include "test_sink.h"
#include "spdlog/stopwatch.h"
TEST_CASE("stopwatch1", "[stopwatch]")
{
using std::chrono::milliseconds;
milliseconds wait_ms(250);
milliseconds tolerance_ms(250);
spdlog::stopwatch sw;
std::this_thread::sleep_for(wait_ms);
REQUIRE(sw.elapsed() >= wait_ms);
REQUIRE(sw.elapsed() <= wait_ms + tolerance_ms);
}
TEST_CASE("stopwatch2", "[stopwatch]")
{
using spdlog::sinks::test_sink_st;
std::chrono::duration<double> wait_duration(0.250);
std::chrono::duration<double> tolerance_duration(0.250);
auto test_sink = std::make_shared<test_sink_st>();
spdlog::stopwatch sw;
spdlog::logger logger("test-stopwatch", test_sink);
logger.set_pattern("%v");
std::this_thread::sleep_for(wait_duration);
logger.info("{}", sw);
auto val = std::stod(test_sink->lines()[0]);
REQUIRE(val >= wait_duration.count());
REQUIRE(val <= (wait_duration + tolerance_duration).count());
}