aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-02-12 14:50:46 +0100
committerGitHub <[email protected]>2024-02-12 14:50:46 +0100
commitac3ca061ac4dcf107f3b0f60bb58d40b199458d8 (patch)
treedd62b20546928d54e87e5fb9c57fc899a0627a5b /src
parentSave compressed large attachments to temporary files on disk (#650) (diff)
downloadzen-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.cpp72
-rw-r--r--src/zen/cmds/admin_cmd.h3
-rw-r--r--src/zen/cmds/info_cmd.cpp2
-rw-r--r--src/zen/cmds/projectstore_cmd.cpp18
-rw-r--r--src/zen/cmds/trace_cmd.cpp6
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;