Added error logger

This commit is contained in:
aristocratos 2021-05-23 22:25:07 +02:00
parent b5e709da66
commit 342f0af6a8
3 changed files with 94 additions and 35 deletions

View File

@ -29,6 +29,19 @@ tab-size = 4
#include <filesystem>
#include <unistd.h>
namespace Global {
const std::vector<std::array<std::string, 2>> Banner_src = {
{"#E62525", "██████╗ ████████╗ ██████╗ ██████╗"},
{"#CD2121", "██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗ ██╗ ██╗"},
{"#B31D1D", "██████╔╝ ██║ ██║ ██║██████╔╝ ██████╗██████╗"},
{"#9A1919", "██╔══██╗ ██║ ██║ ██║██╔═══╝ ╚═██╔═╝╚═██╔═╝"},
{"#801414", "██████╔╝ ██║ ╚██████╔╝██║ ╚═╝ ╚═╝"},
{"#000000", "╚═════╝ ╚═╝ ╚═════╝ ╚═╝"},
};
const std::string Version = "0.0.10";
}
#include <btop_globs.h>
#include <btop_tools.h>
#include <btop_config.h>
@ -53,7 +66,7 @@ tab-size = 4
#error OSX support not yet implemented!
#endif
#else
#error Platform not supported or could not determine platform!
#error Platform not supported!
#endif
using std::string, std::vector, std::array, std::map, std::atomic, std::endl, std::cout, std::views::iota, std::list, std::accumulate;
@ -62,33 +75,17 @@ namespace fs = std::filesystem;
using namespace Tools;
//? ------------------------------------------------- GLOBALS ---------------------------------------------------------
namespace Global {
const vector<array<string, 2>> Banner_src = {
{"#E62525", "██████╗ ████████╗ ██████╗ ██████╗"},
{"#CD2121", "██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗ ██╗ ██╗"},
{"#B31D1D", "██████╔╝ ██║ ██║ ██║██████╔╝ ██████╗██████╗"},
{"#9A1919", "██╔══██╗ ██║ ██║ ██║██╔═══╝ ╚═██╔═╝╚═██╔═╝"},
{"#801414", "██████╔╝ ██║ ╚██████╔╝██║ ╚═╝ ╚═╝"},
{"#000000", "╚═════╝ ╚═╝ ╚═════╝ ╚═╝"},
};
const string Version = "0.0.1";
string banner;
const uint banner_width = 49;
fs::path conf_dir;
fs::path conf_file;
fs::path logfile;
fs::path theme_folder;
fs::path user_theme_folder;
}
//? --------------------------------------- FUNCTIONS, STRUCTS & CLASSES ----------------------------------------------
//* A simple argument parser
void argumentParser(int argc, char **argv){
string argument;
@ -156,10 +153,6 @@ int main(int argc, char **argv){
cout.setf(std::ios::boolalpha);
if (argc > 1) argumentParser(argc, argv);
if (!string(getenv("LANG")).ends_with("UTF-8") && !string(getenv("LANG")).ends_with("utf-8")) {
cout << "WARNING: No UTF-8 locale was detected! Symbols might not look as intended." << endl;
}
#if defined(LINUX)
//? Linux init
Global::proc_path = (fs::is_directory(fs::path("/proc")) && access("/proc", R_OK) != -1) ? "/proc" : "";
@ -182,7 +175,7 @@ int main(int argc, char **argv){
}
else {
Global::conf_file = Global::conf_dir / "btop.conf";
Global::logfile = Global::conf_dir / "btop.log";
Logger::logfile = Global::conf_dir / "btop.log";
Global::user_theme_folder = Global::conf_dir / "themes";
if (!fs::exists(Global::user_theme_folder) && !fs::create_directory(Global::user_theme_folder)) Global::user_theme_folder.clear();
}
@ -194,10 +187,19 @@ int main(int argc, char **argv){
}
}
string err_msg;
if (!string(getenv("LANG")).ends_with("UTF-8") && !string(getenv("LANG")).ends_with("utf-8")) {
err_msg = "No UTF-8 locale was detected! Symbols might not look as intended.";
Logger::warning(err_msg);
cout << "WARNING: " << err_msg << endl;
}
//? Initialize terminal and set options
if (!Term::init()) {
cout << "ERROR: No tty detected!" << endl;
err_msg = "No tty detected!";
Logger::error(err_msg + " Quitting.");
cout << "ERROR: " << err_msg << endl;
cout << "btop++ needs an interactive shell to run." << endl;
exit(1);
}
@ -216,10 +218,12 @@ int main(int argc, char **argv){
//* ------------------------------------------------ TESTING ------------------------------------------------------
int debug = 0;
int debug = 1;
int tests = 0;
bool debuginit = false;
if (debug > 0) { Logger::loglevel = 4; Logger::debug("Running in debug mode!");}
// cout << Theme("main_bg") << Term::clear << flush;
bool thread_test = false;
@ -298,7 +302,6 @@ int main(int argc, char **argv){
cout << "Up for " << sec_to_dhms(round(system_uptime())) << endl;
//*------>>>>>> Proc testing
@ -454,7 +457,6 @@ int main(int argc, char **argv){
}
}
if (debug == 1) Input::wait();
Term::restore();
if (!debuginit) cout << Term::normal_screen << Term::show_cursor << flush;
return 0;

View File

@ -295,8 +295,7 @@ namespace Proc {
//* Sort processes vector
std::ranges::sort(procs, [&sortint, &reverse](proc_info& a, proc_info& b)
{
std::ranges::sort(procs, [&sortint, &reverse](proc_info& a, proc_info& b) {
switch (sortint) {
case 0: return (reverse) ? a.pid < b.pid : a.pid > b.pid;
case 1: return (reverse) ? a.name < b.name : a.name > b.name;
@ -341,13 +340,21 @@ namespace Proc {
//* Initialize needed variables for collect
void init(){
tstamp = time_ms();
passwd_path = (access("/etc/passwd", R_OK) != -1) ? fs::path("/etc/passwd") : passwd_path; //! add logger error
passwd_path = (access("/etc/passwd", R_OK) != -1) ? fs::path("/etc/passwd") : passwd_path;
if (passwd_path.empty()) Logger::warning("Could not read /etc/passwd, will show UID instead of username.");
page_size = sysconf(_SC_PAGE_SIZE); //! add logger error
if (page_size <= 0) page_size = 4096;
page_size = sysconf(_SC_PAGE_SIZE);
if (page_size <= 0) {
page_size = 4096;
Logger::warning("Could not get system page size. Defaulting to 4096, processes memory usage might be incorrect.");
}
clk_tck = sysconf(_SC_CLK_TCK); //! add logger error
if (clk_tck <= 0) clk_tck = 100;
clk_tck = sysconf(_SC_CLK_TCK);
if (clk_tck <= 0) {
clk_tck = 100;
Logger::warning("Could not get system clocks per second. Defaulting to 100, processes cpu usage might be incorrect.");
}
uint i = 0;
for (auto& item : sort_array) sort_map[item] = i++;

View File

@ -23,12 +23,15 @@ tab-size = 4
#include <cmath>
#include <vector>
#include <iostream>
#include <fstream>
#include <chrono>
#include <ctime>
#include <sstream>
#include <iomanip>
#include <regex>
#include <utility>
#include <atomic>
#include <filesystem>
#include <unistd.h>
#include <termios.h>
@ -36,7 +39,8 @@ tab-size = 4
#include <btop_globs.h>
using std::string, std::vector, std::regex, std::max, std::to_string, std::cin;
using std::string, std::vector, std::regex, std::max, std::to_string, std::cin, std::atomic;
namespace fs = std::filesystem;
//? ------------------------------------------------- NAMESPACES ------------------------------------------------------
@ -449,7 +453,53 @@ namespace Tools {
}
namespace Logger {
string cur_date = Tools::strf_time("%Y-%m-%d");
namespace {
std::atomic<bool> busy (false);
fs::path logfile;
uint loglevel = 2;
bool first = true;
string tdf = "%Y/%m/%d (%T) | ";
unordered_map<uint, string> log_levels = {
{ 0, "DISABLED" },
{ 1, "ERROR" },
{ 2, "WARNING" },
{ 3, "INFO" },
{ 4, "DEBUG" }
};
}
void log_write(uint level, string& msg){
if (logfile.empty() || loglevel < level) return;
while (busy.load()) Tools::sleep_ms(1);
busy.store(true);
if (fs::exists(logfile) && fs::file_size(logfile) > 1024 << 10) {
auto old_log = logfile;
old_log += ".1";
if (fs::exists(old_log)) fs::remove(old_log);
fs::rename(logfile, old_log);
}
std::ofstream lwrite(logfile, std::ios::app);
if (first) { first = false; lwrite << "\n" << Tools::strf_time(tdf) << "----> btop++ v." << Global::Version << "\n";}
lwrite << Tools::strf_time(tdf) << log_levels[level] << ": " << msg << "\n";
lwrite.close();
busy.store(false);
}
void error(string msg){
log_write(1, msg);
}
void warning(string msg){
log_write(2, msg);
}
void info(string msg){
log_write(3, msg);
}
void debug(string msg){
log_write(4, msg);
}
}