summaryrefslogtreecommitdiff
path: root/src/utilities/logger.vala
diff options
context:
space:
mode:
Diffstat (limited to 'src/utilities/logger.vala')
-rw-r--r--src/utilities/logger.vala168
1 files changed, 138 insertions, 30 deletions
diff --git a/src/utilities/logger.vala b/src/utilities/logger.vala
index 3108ba3..5334920 100644
--- a/src/utilities/logger.vala
+++ b/src/utilities/logger.vala
@@ -17,7 +17,7 @@ this program. If not, see <http://www.gnu.org/licenses/>.
namespace GnomePie {
-/////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////
/// A static class which beautifies the messages of the default logger.
/// Some of this code is inspired by plank's written by Robert Dyer.
/// Thanks a lot for this project!
@@ -29,22 +29,33 @@ public class Logger {
/// If these are set to false, the according messages are not shown
/////////////////////////////////////////////////////////////////////
- public static bool display_info { get; set; default = true; }
- public static bool display_debug { get; set; default = true; }
- public static bool display_warning { get; set; default = true; }
- public static bool display_error { get; set; default = true; }
+ private static const bool display_debug = true;
+ private static const bool display_warning = true;
+ private static const bool display_error = true;
+ private static const bool display_message = true;
+
+ /////////////////////////////////////////////////////////////////////
+ /// If these are set to false, the according messages are not logged
+ /////////////////////////////////////////////////////////////////////
+
+ private static const bool log_debug = false;
+ private static const bool log_warning = true;
+ private static const bool log_error = true;
+ private static const bool log_message = true;
/////////////////////////////////////////////////////////////////////
/// If true, a time stamp is shown in each message.
/////////////////////////////////////////////////////////////////////
- public static bool display_time { get; set; default = true; }
+ private static const bool display_time = false;
+ private static const bool log_time = true;
/////////////////////////////////////////////////////////////////////
/// If true, the origin of the message is shown. In form file:line
/////////////////////////////////////////////////////////////////////
- public static bool display_file { get; set; default = false; }
+ private static const bool display_file = false;
+ private static const bool log_file = false;
/////////////////////////////////////////////////////////////////////
/// A regex, used to format the standard message.
@@ -53,6 +64,16 @@ public class Logger {
private static Regex regex = null;
/////////////////////////////////////////////////////////////////////
+ /// Limit log and statistics size to roughly 1 MB.
+ /////////////////////////////////////////////////////////////////////
+
+ private static const int max_log_length = 1000000;
+ private static const int max_stats_length = 1000000;
+
+ private static int log_length;
+ private static int stats_length;
+
+ /////////////////////////////////////////////////////////////////////
/// Possible terminal colors.
/////////////////////////////////////////////////////////////////////
@@ -72,20 +93,84 @@ public class Logger {
/////////////////////////////////////////////////////////////////////
public static void init() {
+ log_length = -1;
+ stats_length = -1;
+
try {
regex = new Regex("""(.*)\.vala(:\d+): (.*)""");
} catch {}
- GLib.Log.set_default_handler(log_func);
+ GLib.Log.set_handler(null, GLib.LogLevelFlags.LEVEL_MASK, log_func);
+ }
+
+ /////////////////////////////////////////////////////////////////////
+ /// Appends a line to the statistics file
+ /////////////////////////////////////////////////////////////////////
+
+ public static void stats(string line) {
+ var stats = GLib.FileStream.open(Paths.stats, "a");
+
+ if (stats != null) {
+ if (stats_length == -1)
+ stats_length = (int)stats.tell();
+
+ string final_line = "[" + get_time() + "] " + line + "\n";
+ stats.puts(final_line);
+ stats_length += final_line.length;
+ }
+
+ if (stats_length > max_stats_length) {
+ string content = "";
+
+ try {
+ GLib.FileUtils.get_contents(Paths.stats, out content);
+ int split_index = content.index_of_char('\n', stats_length - (int)(max_stats_length*0.9));
+ GLib.FileUtils.set_contents(Paths.stats, content.substring(split_index+1));
+
+ stats_length -= (split_index+1);
+ } catch (GLib.FileError e) {}
+ }
+ }
+
+ /////////////////////////////////////////////////////////////////////
+ /// Appends a line to the log file
+ /////////////////////////////////////////////////////////////////////
+
+ private static void write_log_line(string line) {
+ var log = GLib.FileStream.open(Paths.log, "a");
+
+ if (log != null) {
+ if (log_length == -1)
+ log_length = (int)log.tell();
+
+ log.puts(line);
+ log_length += line.length;
+ }
+
+ if (log_length > max_log_length) {
+ string content = "";
+
+ try {
+ GLib.FileUtils.get_contents(Paths.log, out content);
+ int split_index = content.index_of_char('\n', log_length - (int)(max_log_length*0.9));
+ GLib.FileUtils.set_contents(Paths.log, content.substring(split_index+1));
+
+ log_length -= (split_index+1);
+ } catch (GLib.FileError e) {}
+ }
}
/////////////////////////////////////////////////////////////////////
- /// Displays an Info message.
+ /// Displays a message.
/////////////////////////////////////////////////////////////////////
- private static void info(string message) {
- if (display_info) {
- stdout.printf(set_color(Color.GREEN, false) + "[" + get_time() + "MESSAGE]" + message);
+ private static void message(string message, string message_log) {
+ if (display_message) {
+ stdout.printf(set_color(Color.GREEN, false) + "[" + (display_time ? get_time() + " " : "") + "MESSAGE]" + message);
+ }
+
+ if (log_message) {
+ write_log_line("[" + (log_time ? get_time() + " " : "") + "MESSAGE]" + message_log);
}
}
@@ -93,9 +178,13 @@ public class Logger {
/// Displays a Debug message.
/////////////////////////////////////////////////////////////////////
- private static void debug(string message) {
+ private static void debug(string message, string message_log) {
if (display_debug) {
- stdout.printf(set_color(Color.BLUE, false) + "[" + get_time() + " DEBUG ]" + message);
+ stdout.printf(set_color(Color.BLUE, false) + "[" + (display_time ? get_time() + " " : "") + " DEBUG ]" + message);
+ }
+
+ if (log_debug) {
+ write_log_line("[" + (log_time ? get_time() + " " : "") + " DEBUG ]" + message_log);
}
}
@@ -103,9 +192,13 @@ public class Logger {
/// Displays a Warning message.
/////////////////////////////////////////////////////////////////////
- private static void warning(string message) {
+ private static void warning(string message, string message_log) {
if (display_warning) {
- stdout.printf(set_color(Color.YELLOW, false) + "[" + get_time() + "WARNING]" + message);
+ stdout.printf(set_color(Color.YELLOW, false) + "[" + (display_time ? get_time() + " " : "") + "WARNING]" + message);
+ }
+
+ if (log_warning) {
+ write_log_line("[" + (log_time ? get_time() + " " : "") + "WARNING]" + message_log);
}
}
@@ -113,9 +206,13 @@ public class Logger {
/// Displays a Error message.
/////////////////////////////////////////////////////////////////////
- private static void error(string message) {
+ private static void error(string message, string message_log) {
if (display_error) {
- stdout.printf(set_color(Color.RED, false) + "[" + get_time() + " ERROR ]" + message);
+ stdout.printf(set_color(Color.RED, false) + "[" + (display_time ? get_time() + " " : "") + " ERROR ]" + message);
+ }
+
+ if (log_error) {
+ write_log_line("[" + (log_time ? get_time() + " " : "") + " ERROR ]" + message_log);
}
}
@@ -141,12 +238,8 @@ public class Logger {
/////////////////////////////////////////////////////////////////////
private static string get_time() {
- if (display_time) {
- var now = new DateTime.now_local ();
- return "%.2d:%.2d:%.2d:%.6d ".printf (now.get_hour (), now.get_minute (), now.get_second (), now.get_microsecond ());
- } else {
- return "";
- }
+ var now = new DateTime.now_local();
+ return "%.4d:%.2d:%.2d:%.2d:%.2d:%.2d:%.6d".printf(now.get_year(), now.get_month(), now.get_day_of_month(), now.get_hour(), now.get_minute(), now.get_second(), now.get_microsecond());
}
/////////////////////////////////////////////////////////////////////
@@ -166,26 +259,41 @@ public class Logger {
}
/////////////////////////////////////////////////////////////////////
+ /// Helper method to format the message for logging.
+ /////////////////////////////////////////////////////////////////////
+
+ private static string create_log_message(string message) {
+ if (log_file && regex != null && regex.match(message)) {
+ var parts = regex.split(message);
+ return " [%s%s] %s\n".printf(parts[1], parts[2], parts[3]);
+ } else if (regex != null && regex.match(message)) {
+ var parts = regex.split(message);
+ return " %s\n".printf(parts[3]);
+ } else {
+ return " " + message + "\n";
+ }
+ }
+
+ /////////////////////////////////////////////////////////////////////
/// The handler function.
/////////////////////////////////////////////////////////////////////
- private static void log_func(string? d, LogLevelFlags flags, string message) {
-
+ private static void log_func(string? d, LogLevelFlags flags, string text) {
switch (flags) {
case LogLevelFlags.LEVEL_ERROR:
case LogLevelFlags.LEVEL_CRITICAL:
- error(create_message(message));
+ error(create_message(text), create_log_message(text));
break;
case LogLevelFlags.LEVEL_INFO:
case LogLevelFlags.LEVEL_MESSAGE:
- info(create_message(message));
+ message(create_message(text), create_log_message(text));
break;
case LogLevelFlags.LEVEL_DEBUG:
- debug(create_message(message));
+ debug(create_message(text), create_log_message(text));
break;
case LogLevelFlags.LEVEL_WARNING:
default:
- warning(create_message(message));
+ warning(create_message(text), create_log_message(text));
break;
}
}