Skip to content

Commit

Permalink
Make logging output file name configurable (#233)
Browse files Browse the repository at this point in the history
* Make log file name configurable
  • Loading branch information
amete authored Sep 6, 2023
1 parent 7481a4d commit 4646e6e
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 17 deletions.
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,14 +109,16 @@ The `prmon` binary is invoked with the following arguments:

```sh
prmon [--pid PPP] [--filename prmon.txt] [--json-summary prmon.json] \
[--interval 30] [--suppress-hw-info] [--units] [--netdev DEV] \
[--log-filename prmon.log] [--interval 30] \
[--suppress-hw-info] [--units] [--netdev DEV] \
[--disable MON1] [--level LEV] [--level MON:LEV]\
[-- prog arg arg ...]
```

* `--pid` the 'mother' PID to monitor (all children in the same process tree are monitored as well)
* `--filename` output file for time-stamped monitored values
* `--json-summmary` output file for summary data written in JSON format
* `--log-filename` output file for log messages
* `--interval` time, in seconds, between monitoring snapshots
* `--suppress-hw-info` flag that turns-off hardware information collection
* `--units` add information on units for each metric to JSON file
Expand Down Expand Up @@ -165,6 +167,9 @@ with the current summary values. Use the `--units` option to see exactly
which units are used for each metric (the value of `1` for a unit means
it is a pure number).

In the `log-filename` output file, log messages (e.g., errors, warnings etc.)
are written.

Monitoring of CPU, I/O and memory is reliably accurate, at least to within
the sampling time. Monitoring of network I/O is **not reliable** unless the
monitored process is isolated from other processes performing network I/O
Expand Down
6 changes: 2 additions & 4 deletions package/src/MessageBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,8 @@

// Global sinks

static const std::shared_ptr<spdlog::sinks::stdout_color_sink_st> c_sink{
std::make_shared<spdlog::sinks::stdout_color_sink_st>()};
static const std::shared_ptr<spdlog::sinks::basic_file_sink_st> f_sink{
std::make_shared<spdlog::sinks::basic_file_sink_st>("prmon.log", true)};
extern std::shared_ptr<spdlog::sinks::stdout_color_sink_st> c_sink;
extern std::shared_ptr<spdlog::sinks::basic_file_sink_st> f_sink;

// Map from monitor to logging level

Expand Down
32 changes: 20 additions & 12 deletions package/src/prmon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@
#include "utils.h"
#include "wallmon.h"

std::shared_ptr<spdlog::sinks::stdout_color_sink_st> c_sink;
std::shared_ptr<spdlog::sinks::basic_file_sink_st> f_sink;

bool prmon::sigusr1 = false;

int ProcessMonitor(const pid_t mpid, const std::string filename,
Expand Down Expand Up @@ -229,22 +232,16 @@ int main(int argc, char* argv[]) {
// Set defaults
const char* default_filename = "prmon.txt";
const char* default_json_summary = "prmon.json";
const char* default_log_filename = "prmon.log";
const unsigned int default_interval = 30;
const bool default_store_hw_info = true;
const bool default_store_unit_info = false;

// Set up global default logger
spdlog::sinks_init_list s_list = {c_sink, f_sink};
auto logger =
std::make_shared<spdlog::logger>("prmon", s_list.begin(), s_list.end());
logger->set_level(spdlog::level::warn);
logger->flush_on(spdlog::level::warn);
spdlog::set_default_logger(logger);

pid_t pid = -1;
bool got_pid = false;
std::string filename{default_filename};
std::string jsonSummary{default_json_summary};
std::string logFileName{default_log_filename};
std::vector<std::string> netdevs{};
std::vector<std::string> disabled_monitors{};
unsigned int interval{default_interval};
Expand All @@ -256,6 +253,7 @@ int main(int argc, char* argv[]) {
{"pid", required_argument, NULL, 'p'},
{"filename", required_argument, NULL, 'f'},
{"json-summary", required_argument, NULL, 'j'},
{"log-filename", required_argument, NULL, 'o'},
{"interval", required_argument, NULL, 'i'},
{"disable", required_argument, NULL, 'd'},
{"suppress-hw-info", no_argument, NULL, 's'},
Expand All @@ -266,7 +264,7 @@ int main(int argc, char* argv[]) {
{0, 0, 0, 0}};

int c;
while ((c = getopt_long(argc, argv, "-p:f:j:i:d:sun:h:l:", long_options,
while ((c = getopt_long(argc, argv, "-p:f:j:o:i:d:sun:h:l:", long_options,
NULL)) != -1) {
switch (char(c)) {
case 'p':
Expand All @@ -279,6 +277,9 @@ int main(int argc, char* argv[]) {
case 'j':
jsonSummary = optarg;
break;
case 'o':
logFileName = optarg;
break;
case 'i':
interval = std::stoi(optarg);
break;
Expand All @@ -303,7 +304,7 @@ int main(int argc, char* argv[]) {
processLevel(std::string(optarg));
break;
default:
spdlog::error("Use '--help' for usage ");
std::cerr << "Use '--help' for usage " << std::endl;
return 1;
}
}
Expand All @@ -325,6 +326,8 @@ int main(int argc, char* argv[]) {
<< default_filename << ")\n"
<< "[--json-summary, -j FILE] Filename for JSON summary (default "
<< default_json_summary << ")\n"
<< "[--log-filename, -o FILE] Filename for logging (default "
<< default_log_filename << ")\n"
<< "[--interval, -i TIME] Seconds between samples (default "
<< default_interval << ")\n"
<< "[--suppress-hw-info, -s] Disable hardware information (default "
Expand Down Expand Up @@ -382,8 +385,13 @@ int main(int argc, char* argv[]) {
return EXIT_FAILURE;
}

// Now that we know given level option is valid, update the level of the
// global logger
// Set up the global logger
c_sink = std::make_shared<spdlog::sinks::stdout_color_sink_st>();
f_sink =
std::make_shared<spdlog::sinks::basic_file_sink_st>(logFileName, true);
spdlog::sinks_init_list s_list = {c_sink, f_sink};
auto logger =
std::make_shared<spdlog::logger>("prmon", s_list.begin(), s_list.end());
logger->set_level(global_logging_level);
logger->flush_on(global_logging_level);
spdlog::set_default_logger(logger);
Expand Down
5 changes: 5 additions & 0 deletions package/tests/test_fields.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,11 @@
const std::string base_path = TO_STRING(PRMON_SOURCE_DIR);
const std::string prmon_path = base_path + "/package/prmon";

std::shared_ptr<spdlog::sinks::stdout_color_sink_st> c_sink{
std::make_shared<spdlog::sinks::stdout_color_sink_st>()};
std::shared_ptr<spdlog::sinks::basic_file_sink_st> f_sink{
std::make_shared<spdlog::sinks::basic_file_sink_st>("prmon.log", true)};

bool prmon::sigusr1 = false;

int run_prmon(const std::vector<std::string>& disabled_monitors) {
Expand Down
5 changes: 5 additions & 0 deletions package/tests/test_values.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ const std::vector<pid_t> mother_pid{1729};

const std::string base_path = TO_STRING(TESTS_SOURCE_DIR);

std::shared_ptr<spdlog::sinks::stdout_color_sink_st> c_sink{
std::make_shared<spdlog::sinks::stdout_color_sink_st>()};
std::shared_ptr<spdlog::sinks::basic_file_sink_st> f_sink{
std::make_shared<spdlog::sinks::basic_file_sink_st>("prmon.log", true)};

bool prmon::sigusr1 = false;

TEST(IomonTest, IomonMonitonicityTestFixed) {
Expand Down

0 comments on commit 4646e6e

Please sign in to comment.