aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorVaxry <[email protected]>2023-11-14 20:06:04 +0000
committerVaxry <[email protected]>2023-11-14 20:06:04 +0000
commite195e51c1bd4b17398ec6964f30751b6a54bbb44 (patch)
tree31fc8158f4964943c90df98f02d8459fe37b321e
parente8469f8b1bb184a08351ee3cc3fcc4d0638eb90b (diff)
downloadHyprland-e195e51c1bd4b17398ec6964f30751b6a54bbb44.tar.gz
Hyprland-e195e51c1bd4b17398ec6964f30751b6a54bbb44.zip
logging: move to an internal rolling log buffer
disables logging to the logfile by default
-rw-r--r--hyprctl/main.cpp2
-rw-r--r--src/config/ConfigManager.cpp2
-rw-r--r--src/debug/CrashReporter.cpp2
-rw-r--r--src/debug/HyprCtl.cpp16
-rw-r--r--src/debug/HyprCtl.hpp3
-rw-r--r--src/debug/Log.cpp17
-rw-r--r--src/debug/Log.hpp28
7 files changed, 47 insertions, 23 deletions
diff --git a/hyprctl/main.cpp b/hyprctl/main.cpp
index c05b5201..deb8613c 100644
--- a/hyprctl/main.cpp
+++ b/hyprctl/main.cpp
@@ -396,6 +396,8 @@ int main(int argc, char** argv) {
request(fullRequest);
else if (fullRequest.contains("/globalshortcuts"))
request(fullRequest);
+ else if (fullRequest.contains("/rollinglog"))
+ request(fullRequest);
else if (fullRequest.contains("/instances"))
instancesRequest(json);
else if (fullRequest.contains("/switchxkblayout"))
diff --git a/src/config/ConfigManager.cpp b/src/config/ConfigManager.cpp
index 424b67a4..2bd1d91d 100644
--- a/src/config/ConfigManager.cpp
+++ b/src/config/ConfigManager.cpp
@@ -145,7 +145,7 @@ void CConfigManager::setDefaultVars() {
configValues["debug:log_damage"].intValue = 0;
configValues["debug:overlay"].intValue = 0;
configValues["debug:damage_blink"].intValue = 0;
- configValues["debug:disable_logs"].intValue = 0;
+ configValues["debug:disable_logs"].intValue = 1;
configValues["debug:disable_time"].intValue = 1;
configValues["debug:enable_stdout_logs"].intValue = 0;
configValues["debug:damage_tracking"].intValue = DAMAGE_TRACKING_FULL;
diff --git a/src/debug/CrashReporter.cpp b/src/debug/CrashReporter.cpp
index ddc52561..14aa5c5b 100644
--- a/src/debug/CrashReporter.cpp
+++ b/src/debug/CrashReporter.cpp
@@ -119,7 +119,7 @@ void CrashReporter::createAndSaveCrash(int sig) {
finalCrashReport += "\n\nLog tail:\n";
- finalCrashReport += execAndGet(("cat \"" + Debug::logFile + "\" | tail -n 50").c_str());
+ finalCrashReport += Debug::rollingLog;
const auto HOME = getenv("HOME");
const auto CACHE_HOME = getenv("XDG_CACHE_HOME");
diff --git a/src/debug/HyprCtl.cpp b/src/debug/HyprCtl.cpp
index 217895b1..11f8d785 100644
--- a/src/debug/HyprCtl.cpp
+++ b/src/debug/HyprCtl.cpp
@@ -625,6 +625,20 @@ std::string animationsRequest(HyprCtl::eHyprCtlOutputFormat format) {
return ret;
}
+std::string rollinglogRequest(HyprCtl::eHyprCtlOutputFormat format) {
+ std::string result = "";
+
+ if (format == HyprCtl::FORMAT_JSON) {
+ result += "[\n\"log\":\"";
+ result += escapeJSONStrings(Debug::rollingLog);
+ result += "\"]";
+ } else {
+ result = Debug::rollingLog;
+ }
+
+ return result;
+}
+
std::string globalShortcutsRequest(HyprCtl::eHyprCtlOutputFormat format) {
std::string ret = "";
const auto SHORTCUTS = g_pProtocolManager->m_pGlobalShortcutsProtocolManager->getAllShortcuts();
@@ -1351,6 +1365,8 @@ std::string getReply(std::string request) {
return globalShortcutsRequest(format);
else if (request == "animations")
return animationsRequest(format);
+ else if (request == "rollinglog")
+ return rollinglogRequest(format);
else if (request.starts_with("plugin"))
return dispatchPlugin(request);
else if (request.starts_with("notify"))
diff --git a/src/debug/HyprCtl.hpp b/src/debug/HyprCtl.hpp
index 00cf7c5b..4816c63c 100644
--- a/src/debug/HyprCtl.hpp
+++ b/src/debug/HyprCtl.hpp
@@ -19,7 +19,8 @@ namespace HyprCtl {
inline int iSocketFD = -1;
- enum eHyprCtlOutputFormat {
+ enum eHyprCtlOutputFormat
+ {
FORMAT_NORMAL = 0,
FORMAT_JSON
};
diff --git a/src/debug/Log.cpp b/src/debug/Log.cpp
index 98eeebc9..404904a2 100644
--- a/src/debug/Log.cpp
+++ b/src/debug/Log.cpp
@@ -10,25 +10,24 @@ void Debug::init(const std::string& IS) {
}
void Debug::wlrLog(wlr_log_importance level, const char* fmt, va_list args) {
- if (disableLogs && *disableLogs)
- return;
-
if (level > wlr_log_get_verbosity())
return;
- char* outputStr = nullptr;
-
- std::ofstream ofs;
- ofs.open(logFile, std::ios::out | std::ios::app);
+ char* outputStr = nullptr;
vasprintf(&outputStr, fmt, args);
std::string output = std::string(outputStr);
free(outputStr);
- ofs << "[wlr] " << output << "\n";
+ rollingLog += output + "\n";
- ofs.close();
+ if (!disableLogs || !*disableLogs) {
+ std::ofstream ofs;
+ ofs.open(logFile, std::ios::out | std::ios::app);
+ ofs << "[wlr] " << output << "\n";
+ ofs.close();
+ }
if (!disableStdout)
std::cout << output << "\n";
diff --git a/src/debug/Log.hpp b/src/debug/Log.hpp
index 085465c9..659e2db4 100644
--- a/src/debug/Log.hpp
+++ b/src/debug/Log.hpp
@@ -7,9 +7,11 @@
#include "../includes.hpp"
#include "../helpers/MiscFunctions.hpp"
-#define LOGMESSAGESIZE 1024
+#define LOGMESSAGESIZE 1024
+#define ROLLING_LOG_SIZE 4096
-enum LogLevel {
+enum LogLevel
+{
NONE = -1,
LOG = 0,
WARN,
@@ -26,12 +28,11 @@ namespace Debug {
inline bool disableStdout = false;
inline bool trace = false;
+ inline std::string rollingLog = ""; // rolling log contains the ROLLING_LOG_SIZE tail of the log
+
void init(const std::string& IS);
template <typename... Args>
void log(LogLevel level, std::format_string<Args...> fmt, Args&&... args) {
- if (disableLogs && *disableLogs)
- return;
-
if (level == TRACE && !trace)
return;
@@ -47,10 +48,6 @@ namespace Debug {
default: break;
}
- // log to a file
- std::ofstream ofs;
- ofs.open(logFile, std::ios::out | std::ios::app);
-
// print date and time to the ofs
if (disableTime && !*disableTime) {
#ifndef _LIBCPP_VERSION
@@ -69,9 +66,18 @@ namespace Debug {
// 3. this is actually what std::format in stdlib does
logMsg += std::vformat(fmt.get(), std::make_format_args(args...));
- ofs << logMsg << "\n";
+ rollingLog += logMsg + "\n";
+ if (rollingLog.size() > ROLLING_LOG_SIZE)
+ rollingLog = rollingLog.substr(rollingLog.size() - ROLLING_LOG_SIZE);
+
+ if (!disableLogs || !*disableLogs) {
+ // log to a file
+ std::ofstream ofs;
+ ofs.open(logFile, std::ios::out | std::ios::app);
+ ofs << logMsg << "\n";
- ofs.close();
+ ofs.close();
+ }
// log it to the stdout too.
if (!disableStdout)