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 | |
| parent | Save compressed large attachments to temporary files on disk (#650) (diff) | |
| download | zen-ac3ca061ac4dcf107f3b0f60bb58d40b199458d8.tar.xz 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')
| -rw-r--r-- | src/zen/cmds/admin_cmd.cpp | 72 | ||||
| -rw-r--r-- | src/zen/cmds/admin_cmd.h | 3 | ||||
| -rw-r--r-- | src/zen/cmds/info_cmd.cpp | 2 | ||||
| -rw-r--r-- | src/zen/cmds/projectstore_cmd.cpp | 18 | ||||
| -rw-r--r-- | src/zen/cmds/trace_cmd.cpp | 6 |
5 files changed, 81 insertions, 20 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; diff --git a/src/zen/cmds/admin_cmd.h b/src/zen/cmds/admin_cmd.h index 12029d57e..5fdd8672a 100644 --- a/src/zen/cmds/admin_cmd.h +++ b/src/zen/cmds/admin_cmd.h @@ -116,6 +116,9 @@ private: std::string m_CacheWriteLog; std::string m_CacheAccessLog; std::string m_SetLogLevel; + std::string m_ServerLogTarget; + std::string m_CacheLogTarget; + std::string m_HttpLogTarget; }; /** Flush storage diff --git a/src/zen/cmds/info_cmd.cpp b/src/zen/cmds/info_cmd.cpp index aec8ca46b..73a5d2e5d 100644 --- a/src/zen/cmds/info_cmd.cpp +++ b/src/zen/cmds/info_cmd.cpp @@ -42,7 +42,7 @@ InfoCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) if (HttpClient::Response Result = Http.Get("/admin/info", HttpClient::Accept(ZenContentType::kJSON))) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); } return 0; diff --git a/src/zen/cmds/projectstore_cmd.cpp b/src/zen/cmds/projectstore_cmd.cpp index 0fe7b14eb..2132d428d 100644 --- a/src/zen/cmds/projectstore_cmd.cpp +++ b/src/zen/cmds/projectstore_cmd.cpp @@ -12,6 +12,7 @@ #include <zenhttp/formatters.h> #include <zenhttp/httpclient.h> #include <zenhttp/httpcommon.h> +#include <zenutil/basicfile.h> ZEN_THIRD_PARTY_INCLUDES_START #include <cpr/cpr.h> @@ -54,7 +55,7 @@ namespace { } } - void AsyncPost(HttpClient& Http, std::string_view Url, IoBuffer&& Payload) + void ExecuteAsyncOperation(HttpClient& Http, std::string_view Url, IoBuffer&& Payload) { if (HttpClient::Response Result = Http.Post(Url, Payload)) { @@ -934,7 +935,7 @@ ExportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg HttpClient::Accept(ZenContentType::kJSON)); Result) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); } else { @@ -944,7 +945,7 @@ ExportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg } else { - AsyncPost(Http, fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName), std::move(Payload)); + ExecuteAsyncOperation(Http, fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName), std::move(Payload)); } return 0; } @@ -1090,7 +1091,8 @@ ImportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg } } - HttpClient Http(m_HostName); + HttpClient Http(m_HostName); + std::string Url = fmt::format("/prj/{}/oplog/{}", m_ProjectName, m_OplogName); bool CreateOplog = false; @@ -1213,7 +1215,7 @@ ImportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg HttpClient::Accept(ZenContentType::kJSON)); Result) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); } else { @@ -1223,7 +1225,7 @@ ImportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg } else { - AsyncPost(Http, fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName), std::move(Payload)); + ExecuteAsyncOperation(Http, fmt::format("/prj/{}/oplog/{}/rpc", m_ProjectName, m_OplogName), std::move(Payload)); } return 0; } @@ -1325,7 +1327,7 @@ ProjectStatsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** ar HttpClient Http(m_HostName); if (HttpClient::Response Result = Http.Get("/stats/prj", HttpClient::Accept(ZenContentType::kJSON))) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); return 0; } else @@ -1423,7 +1425,7 @@ ProjectDetailsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** {"attachmentdetails", m_AttachmentDetails ? "true" : "false"}, {"csv", m_CSV ? "true" : "false"}})) { - ZEN_CONSOLE("{}", Result.AsText()); + ZEN_CONSOLE("{}", Result.ToText()); return 0; } else diff --git a/src/zen/cmds/trace_cmd.cpp b/src/zen/cmds/trace_cmd.cpp index fee4dd6bc..dacc13ebf 100644 --- a/src/zen/cmds/trace_cmd.cpp +++ b/src/zen/cmds/trace_cmd.cpp @@ -48,7 +48,7 @@ TraceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) } else { - ZEN_ERROR("trace stop failed: {}", Response.AsText()); + ZEN_ERROR("trace stop failed: {}", Response.ToText()); return 1; } } @@ -72,7 +72,7 @@ TraceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) } else { - ZEN_ERROR("trace start failed: {}", Response.AsText()); + ZEN_ERROR("trace start failed: {}", Response.ToText()); return 1; } } @@ -84,7 +84,7 @@ TraceCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) } else { - ZEN_ERROR("trace status failed: {}", Response.AsText()); + ZEN_ERROR("trace status failed: {}", Response.ToText()); } return 1; |