Skip to content

Commit 6927aad

Browse files
committed
add support for stdout/err in logger
1 parent 80c08f1 commit 6927aad

File tree

2 files changed

+57
-17
lines changed

2 files changed

+57
-17
lines changed

include/rmm/mr/device/logging_resource_adaptor.hpp

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,28 @@
2020
#include <rmm/detail/error.hpp>
2121

2222
#include <spdlog/sinks/basic_file_sink.h>
23+
#include <spdlog/sinks/stdout_sinks.h>
2324
#include <spdlog/spdlog.h>
2425
#include <sstream>
2526
#include <memory>
2627

2728
namespace rmm {
2829
namespace mr {
30+
31+
/**
32+
* @brief Output location of the log.
33+
*/
34+
enum class LogLocation {
35+
FILE = 1,
36+
STDOUT = 2,
37+
STDERR = 3
38+
};
39+
2940
/**
3041
* @brief Resource that uses `Upstream` to allocate memory and logs information
3142
* about the requested allocation/deallocations.
3243
*
33-
* An instance of this resource can be constructured with an existing, upstream
44+
* An instance of this resource can be constructed with an existing, upstream
3445
* resource in order to satisfy allocation requests and log
3546
* allocation/deallocation activity.
3647
*
@@ -59,15 +70,29 @@ class logging_resource_adaptor final : public device_memory_resource {
5970
* @param filename Name of file to write log info. If not specified, retrieves
6071
* the file name from the environment variable "RMM_LOG_FILE".
6172
*/
62-
logging_resource_adaptor(Upstream* upstream, std::string const& filename =
63-
get_default_filename())
64-
: upstream_{upstream},
65-
logger_{std::make_shared<spdlog::logger>(
66-
"RMM", std::make_shared<spdlog::sinks::basic_file_sink_mt>(
67-
filename, true /*truncate file*/))} {
73+
logging_resource_adaptor(Upstream* upstream,
74+
LogLocation location = LogLocation::FILE,
75+
std::string const& filename = {})
76+
: upstream_{upstream} {
6877
RMM_EXPECTS(nullptr != upstream,
6978
"Unexpected null upstream resource pointer.");
7079

80+
switch (location) {
81+
case LogLocation::FILE:
82+
logger_ = std::make_shared<spdlog::logger>(
83+
"RMM", std::make_shared<spdlog::sinks::basic_file_sink_mt>(
84+
filename.empty() ? get_default_filename() : filename, true /*truncate file*/));
85+
break;
86+
case LogLocation::STDOUT:
87+
logger_ = std::make_shared<spdlog::logger>(
88+
"RMM", std::make_shared<spdlog::sinks::stdout_sink_mt>());
89+
break;
90+
case LogLocation::STDERR:
91+
logger_ = std::make_shared<spdlog::logger>(
92+
"RMM", std::make_shared<spdlog::sinks::stderr_sink_mt>());
93+
break;
94+
}
95+
7196
auto const csv_header{"Time,Action,Pointer,Size,Stream"};
7297
logger_->set_pattern("%v");
7398
logger_->info(csv_header);
@@ -99,11 +124,6 @@ class logging_resource_adaptor final : public device_memory_resource {
99124
bool supports_get_mem_info() const noexcept override { return upstream_->supports_streams(); }
100125

101126
private:
102-
// make_logging_adaptor needs access to private get_default_filename
103-
template <typename T>
104-
friend logging_resource_adaptor<T> make_logging_adaptor(
105-
T* upstream, std::string const& filename);
106-
107127
/**
108128
* @brief Return the value of the environment variable RMM_LOG_FILE.
109129
*
@@ -231,9 +251,9 @@ class logging_resource_adaptor final : public device_memory_resource {
231251
template <typename Upstream>
232252
logging_resource_adaptor<Upstream> make_logging_adaptor(
233253
Upstream* upstream,
234-
std::string const& filename =
235-
logging_resource_adaptor<Upstream>::get_default_filename()) {
236-
return logging_resource_adaptor<Upstream>{upstream, filename};
254+
LogLocation location = LogLocation::FILE,
255+
std::string const& filename = {}) {
256+
return logging_resource_adaptor<Upstream>{upstream, location, filename};
237257
}
238258

239259
} // namespace mr

tests/logger_tests.cpp

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ TEST(Adaptor, first) {
5050
rmm::mr::cuda_memory_resource upstream;
5151

5252
rmm::mr::logging_resource_adaptor<rmm::mr::cuda_memory_resource> log_mr{
53-
&upstream, "logs/test1.txt"};
53+
&upstream, rmm::mr::LogLocation::FILE, "logs/test1.txt"};
5454

5555
auto p = log_mr.allocate(100);
5656
log_mr.deallocate(p, 100);
@@ -59,7 +59,8 @@ TEST(Adaptor, first) {
5959
TEST(Adaptor, factory) {
6060
rmm::mr::cuda_memory_resource upstream;
6161

62-
auto log_mr = rmm::mr::make_logging_adaptor(&upstream, "logs/test2.txt");
62+
auto log_mr = rmm::mr::make_logging_adaptor(
63+
&upstream, rmm::mr::LogLocation::FILE, "logs/test2.txt");
6364

6465
auto p = log_mr.allocate(100);
6566
log_mr.deallocate(p, 100);
@@ -84,3 +85,22 @@ TEST(Adaptor, EnviromentPath) {
8485
auto p = log_mr.allocate(100);
8586
log_mr.deallocate(p, 100);
8687
}
88+
89+
TEST(Adaptor, STDOUT) {
90+
rmm::mr::cuda_memory_resource upstream;
91+
92+
auto log_mr = rmm::mr::make_logging_adaptor(&upstream, rmm::mr::LogLocation::STDOUT);
93+
94+
auto p = log_mr.allocate(100);
95+
log_mr.deallocate(p, 100);
96+
}
97+
98+
TEST(Adaptor, STDERR) {
99+
rmm::mr::cuda_memory_resource upstream;
100+
101+
auto log_mr = rmm::mr::make_logging_adaptor(&upstream, rmm::mr::LogLocation::STDERR);
102+
103+
auto p = log_mr.allocate(100);
104+
log_mr.deallocate(p, 100);
105+
}
106+

0 commit comments

Comments
 (0)