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 void log(LogLevel level, std::format_string 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); - ofs.close(); + if (!disableLogs || !*disableLogs) { + // log to a file + std::ofstream ofs; + ofs.open(logFile, std::ios::out | std::ios::app); + ofs << logMsg << "\n"; + + ofs.close(); + } // log it to the stdout too. if (!disableStdout)