diff options
| author | Dan Engelbrecht <[email protected]> | 2024-02-12 14:50:46 +0100 |
|---|---|---|
| committer | GitHub <[email protected]> | 2024-02-12 14:50:46 +0100 |
| commit | ac3ca061ac4dcf107f3b0f60bb58d40b199458d8 (patch) | |
| tree | dd62b20546928d54e87e5fb9c57fc899a0627a5b /src/zen/cmds/admin_cmd.cpp | |
| parent | Save compressed large attachments to temporary files on disk (#650) (diff) | |
| download | archived-zen-ac3ca061ac4dcf107f3b0f60bb58d40b199458d8.tar.xz archived-zen-ac3ca061ac4dcf107f3b0f60bb58d40b199458d8.zip | |
Added --copy-log, --copy-cache-log and copy-http-log option to zen logs command (#651)
* be safe and use ToText() rather than AsText() when getting http responses
* Added `--copy-log`, `--copy-cache-log` and `copy-http-log` option to zen logs command to copy logs from a local running zen server instance
Diffstat (limited to 'src/zen/cmds/admin_cmd.cpp')
| -rw-r--r-- | src/zen/cmds/admin_cmd.cpp | 72 |
1 files changed, 64 insertions, 8 deletions
diff --git a/src/zen/cmds/admin_cmd.cpp b/src/zen/cmds/admin_cmd.cpp index 1bde785c7..15a729c78 100644 --- a/src/zen/cmds/admin_cmd.cpp +++ b/src/zen/cmds/admin_cmd.cpp @@ -59,11 +59,11 @@ ScrubCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) ZEN_ERROR("scrub start failed: {}: {} ({})", (int)Response.StatusCode, ReasonStringForHttpResultCode((int)Response.StatusCode), - Response.AsText()); + Response.ToText()); } else { - ZEN_ERROR("scrub start failed: {}", Response.AsText()); + ZEN_ERROR("scrub start failed: {}", Response.ToText()); } return 1; @@ -358,7 +358,7 @@ JobCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) } else if (HttpClient::Response Result = Http.Get(Url, HttpClient::Accept(ZenContentType::kJSON))) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); } else { @@ -379,6 +379,24 @@ LoggingCommand::LoggingCommand() m_Options.add_option("", "", "cache-access-log", "Enable cache access logging", cxxopts::value(m_CacheAccessLog), "<enable/disable>"); m_Options .add_option("", "", "set-log-level", "Set zenserver log level", cxxopts::value(m_SetLogLevel), "<trace/debug/info/warning/error>"); + m_Options.add_option("", + "", + "copy-log", + "Copy the server log file from a local zenserver instance", + cxxopts::value(m_ServerLogTarget), + "<targetpath>"); + m_Options.add_option("", + "", + "copy-cache-log", + "Copy the server cache log file from a local zenserver instance", + cxxopts::value(m_CacheLogTarget), + "<targetpath>"); + m_Options.add_option("", + "", + "copy-http-log", + "Copy the server http log file from a local zenserver instance", + cxxopts::value(m_HttpLogTarget), + "<targetpath>"); } LoggingCommand::~LoggingCommand() = default; @@ -447,9 +465,47 @@ LoggingCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) if ((*Parameters).empty()) { - if (HttpClient::Response Result = Http.Get("/admin/logs", HttpClient::Accept(ZenContentType::kJSON))) + if (HttpClient::Response Result = Http.Get("/admin/logs", HttpClient::Accept(ZenContentType::kCbObject))) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); + const CbObject LogsResponse = Result.AsObject(); + + auto CopyLog = [](std::string_view SourceName, std::string_view SourcePath, std::string_view TargetPath) -> bool { + if (SourcePath.empty()) + { + ZEN_ERROR("Failed to retrieve {} log path", SourceName); + return false; + } + if (!CopyFile(SourcePath, TargetPath, {})) + { + ZEN_ERROR("Failed to copy {} log file {} to output file '{}'", SourceName, SourcePath, TargetPath); + return false; + } + return true; + }; + + if (!m_ServerLogTarget.empty()) + { + if (!CopyLog("server", LogsResponse["Logfile"].AsString(), m_ServerLogTarget)) + { + return 1; + } + } + + if (!m_CacheLogTarget.empty()) + { + if (!CopyLog("cache", LogsResponse["cache"].AsObjectView()["Logfile"].AsString(), m_CacheLogTarget)) + { + return 1; + } + } + if (!m_HttpLogTarget.empty()) + { + if (!CopyLog("http", LogsResponse["http"].AsObjectView()["Logfile"].AsString(), m_HttpLogTarget)) + { + return 1; + } + } } else { @@ -460,7 +516,7 @@ LoggingCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) } if (HttpClient::Response Result = Http.Post("/admin/logs", HttpClient::KeyValueMap{}, Parameters)) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); } else { @@ -511,11 +567,11 @@ FlushCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) ZEN_ERROR("flush failed: {}: {} ({})", (int)Response.StatusCode, ReasonStringForHttpResultCode((int)Response.StatusCode), - Response.AsText()); + Response.ToText()); } else { - ZEN_ERROR("flush failed: {}", Response.AsText()); + ZEN_ERROR("flush failed: {}", Response.ToText()); } return 1; |