abraunegg-onedrive/src/log.d

156 lines
5 KiB
D
Raw Normal View History

Squashed commit of the following: commit 1eff2d7d673a7e058ba9467f4da315237b47392e Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 19:15:27 2023 +1100 Update PR * Add --source-directory 'path/as/source/' --destination-directory 'path/as/destination' functionality commit ad3ddee0ec86ad70be4c939d9bcc44773819ec2d Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 17:32:24 2023 +1100 Update PR * Add --create-directory * Add --remove-directory commit 7dfe6b65b7a6d88e72094685f0c968441097c921 Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 12:27:03 2023 +1100 Update PR * Update PR commit 75c071e56f3493c53c6c41753f2c36e761057d45 Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 10:12:05 2023 +1100 Update PR * Update PR commit 6db484cdad332e9b351e1fef7d59080637c195f9 Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 16 17:01:25 2023 +1100 Update PR * Update PR commit d893ea54604b0a0e27c722a761686cfb5086bc3b Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 10:43:50 2023 +1100 Update PR * Update PR commit 82bd593bf4daf183a3e900e444a4725d8913da9d Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 09:14:17 2023 +1100 Update PR * Validate and document --auth-files operation commit c551203f4c2bf0de8254015da107f53cc0936aae Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 05:48:22 2023 +1100 Update PR * Add --create-share-link commit fbf63999ff31086ab62faec9dcdcf271e046d957 Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 18:39:21 2023 +1100 Update PR * Update PR commit 72a46800350ad970e3a4e61df2305000510a0354 Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 17:43:15 2023 +1100 Update PR * Add --get-file-link * Add --modified-by commit 0d3fc3ebf23c85fb0c8e43fe84d9aff68115552a Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 14:28:10 2023 +1100 Add --display-sync-status * Add --display-sync-status commit 1f183ca03ec96aef1fa895e24f0ae256a0a53d84 Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 9 08:18:13 2023 +1100 Update PR * Update PR with doc updates commit b0628d709921cca820dc6a7179a27756c82710e4 Author: abraunegg <alex.braunegg@gmail.com> Date: Sun Oct 8 10:52:52 2023 +1100 Update PR * Update PR commit 7e3df956ce489646dfad5e87af8d33d93de974d7 Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:31:26 2023 +1100 Update PR * Update PR commit c69f2abc4b5e570b315b277cbd7beb8eae5a7bbf Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:28:28 2023 +1100 Update PR * Update PR commit ea1ca333741520ae66d413acf92a71d78eebd32d Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 14:57:51 2023 +1100 Update PR * Update PR commit 1503f969dfa6c8c008f3ccd8bd1cc203bd12e7ee Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 09:19:04 2023 +1100 Update PR * Update PR commit 5127464f2c08942b864b23691e56d73fe9cb9e16 Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 06:48:20 2023 +1100 Change when the integrity check is performed * Change when the integrity check is performed commit c7cc45d95c14801d8f616c4a04e0fb030c4e5b02 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 19:40:05 2023 +1100 Update maxInotifyWatches location * Update maxInotifyWatches location commit c44ad963a6e7d2d80eeee7ef82a3ab53d6448486 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:41:31 2023 +1100 Update main.d * Fix --version segfault commit 51f0ffcb1f6a5ae80a1ecb65e4dda9efc2db4f94 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:24:30 2023 +1100 Uplift to v2.5.0-alpha-2 * Uplift to v2.5.0-alpha-2 commit cbe3e6ea845dfe17b909141b2c87fbfae8086669 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:17:26 2023 +1100 Clean up before onedrive-v2.5.0-alpha-2 * Clean up before onedrive-v2.5.0-alpha-2
2023-10-18 20:31:50 +02:00
// What is this module called?
module log;
// What does this module require to function?
import std.stdio;
import std.file;
import std.datetime;
import std.concurrency;
import std.typecons;
import core.sync.mutex;
import core.thread;
import std.format;
Squashed commit of the following: commit 1eff2d7d673a7e058ba9467f4da315237b47392e Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 19:15:27 2023 +1100 Update PR * Add --source-directory 'path/as/source/' --destination-directory 'path/as/destination' functionality commit ad3ddee0ec86ad70be4c939d9bcc44773819ec2d Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 17:32:24 2023 +1100 Update PR * Add --create-directory * Add --remove-directory commit 7dfe6b65b7a6d88e72094685f0c968441097c921 Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 12:27:03 2023 +1100 Update PR * Update PR commit 75c071e56f3493c53c6c41753f2c36e761057d45 Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 10:12:05 2023 +1100 Update PR * Update PR commit 6db484cdad332e9b351e1fef7d59080637c195f9 Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 16 17:01:25 2023 +1100 Update PR * Update PR commit d893ea54604b0a0e27c722a761686cfb5086bc3b Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 10:43:50 2023 +1100 Update PR * Update PR commit 82bd593bf4daf183a3e900e444a4725d8913da9d Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 09:14:17 2023 +1100 Update PR * Validate and document --auth-files operation commit c551203f4c2bf0de8254015da107f53cc0936aae Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 05:48:22 2023 +1100 Update PR * Add --create-share-link commit fbf63999ff31086ab62faec9dcdcf271e046d957 Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 18:39:21 2023 +1100 Update PR * Update PR commit 72a46800350ad970e3a4e61df2305000510a0354 Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 17:43:15 2023 +1100 Update PR * Add --get-file-link * Add --modified-by commit 0d3fc3ebf23c85fb0c8e43fe84d9aff68115552a Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 14:28:10 2023 +1100 Add --display-sync-status * Add --display-sync-status commit 1f183ca03ec96aef1fa895e24f0ae256a0a53d84 Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 9 08:18:13 2023 +1100 Update PR * Update PR with doc updates commit b0628d709921cca820dc6a7179a27756c82710e4 Author: abraunegg <alex.braunegg@gmail.com> Date: Sun Oct 8 10:52:52 2023 +1100 Update PR * Update PR commit 7e3df956ce489646dfad5e87af8d33d93de974d7 Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:31:26 2023 +1100 Update PR * Update PR commit c69f2abc4b5e570b315b277cbd7beb8eae5a7bbf Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:28:28 2023 +1100 Update PR * Update PR commit ea1ca333741520ae66d413acf92a71d78eebd32d Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 14:57:51 2023 +1100 Update PR * Update PR commit 1503f969dfa6c8c008f3ccd8bd1cc203bd12e7ee Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 09:19:04 2023 +1100 Update PR * Update PR commit 5127464f2c08942b864b23691e56d73fe9cb9e16 Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 06:48:20 2023 +1100 Change when the integrity check is performed * Change when the integrity check is performed commit c7cc45d95c14801d8f616c4a04e0fb030c4e5b02 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 19:40:05 2023 +1100 Update maxInotifyWatches location * Update maxInotifyWatches location commit c44ad963a6e7d2d80eeee7ef82a3ab53d6448486 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:41:31 2023 +1100 Update main.d * Fix --version segfault commit 51f0ffcb1f6a5ae80a1ecb65e4dda9efc2db4f94 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:24:30 2023 +1100 Uplift to v2.5.0-alpha-2 * Uplift to v2.5.0-alpha-2 commit cbe3e6ea845dfe17b909141b2c87fbfae8086669 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:17:26 2023 +1100 Clean up before onedrive-v2.5.0-alpha-2 * Clean up before onedrive-v2.5.0-alpha-2
2023-10-18 20:31:50 +02:00
import std.string;
version(Notifications) {
import dnotify;
}
// Shared module object
shared LogBuffer logBuffer;
class LogBuffer {
private:
string[3][] buffer;
Mutex bufferLock;
string logFilePath;
bool writeToFile;
bool verboseLogging;
bool debugLogging;
Thread flushThread;
bool isRunning;
bool sendGUINotification;
public:
this(bool verboseLogging, bool debugLogging) {
// Initialise the mutex
bufferLock = new Mutex();
// Initialise other items
this.logFilePath = logFilePath;
this.writeToFile = writeToFile;
this.verboseLogging = verboseLogging;
this.debugLogging = debugLogging;
this.isRunning = true;
this.sendGUINotification = true;
this.flushThread = new Thread(&flushBuffer);
flushThread.isDaemon(true);
flushThread.start();
}
~this() {
isRunning = false;
flushThread.join();
flush();
}
shared void logThisMessage(string message, string[] levels = ["info"]) {
// Generate the timestamp for this log entry
auto timeStamp = leftJustify(Clock.currTime().toString(), 28, '0');
Squashed commit of the following: commit 1eff2d7d673a7e058ba9467f4da315237b47392e Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 19:15:27 2023 +1100 Update PR * Add --source-directory 'path/as/source/' --destination-directory 'path/as/destination' functionality commit ad3ddee0ec86ad70be4c939d9bcc44773819ec2d Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 17:32:24 2023 +1100 Update PR * Add --create-directory * Add --remove-directory commit 7dfe6b65b7a6d88e72094685f0c968441097c921 Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 12:27:03 2023 +1100 Update PR * Update PR commit 75c071e56f3493c53c6c41753f2c36e761057d45 Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 18 10:12:05 2023 +1100 Update PR * Update PR commit 6db484cdad332e9b351e1fef7d59080637c195f9 Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 16 17:01:25 2023 +1100 Update PR * Update PR commit d893ea54604b0a0e27c722a761686cfb5086bc3b Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 10:43:50 2023 +1100 Update PR * Update PR commit 82bd593bf4daf183a3e900e444a4725d8913da9d Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 09:14:17 2023 +1100 Update PR * Validate and document --auth-files operation commit c551203f4c2bf0de8254015da107f53cc0936aae Author: abraunegg <alex.braunegg@gmail.com> Date: Wed Oct 11 05:48:22 2023 +1100 Update PR * Add --create-share-link commit fbf63999ff31086ab62faec9dcdcf271e046d957 Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 18:39:21 2023 +1100 Update PR * Update PR commit 72a46800350ad970e3a4e61df2305000510a0354 Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 17:43:15 2023 +1100 Update PR * Add --get-file-link * Add --modified-by commit 0d3fc3ebf23c85fb0c8e43fe84d9aff68115552a Author: abraunegg <alex.braunegg@gmail.com> Date: Tue Oct 10 14:28:10 2023 +1100 Add --display-sync-status * Add --display-sync-status commit 1f183ca03ec96aef1fa895e24f0ae256a0a53d84 Author: abraunegg <alex.braunegg@gmail.com> Date: Mon Oct 9 08:18:13 2023 +1100 Update PR * Update PR with doc updates commit b0628d709921cca820dc6a7179a27756c82710e4 Author: abraunegg <alex.braunegg@gmail.com> Date: Sun Oct 8 10:52:52 2023 +1100 Update PR * Update PR commit 7e3df956ce489646dfad5e87af8d33d93de974d7 Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:31:26 2023 +1100 Update PR * Update PR commit c69f2abc4b5e570b315b277cbd7beb8eae5a7bbf Author: abraunegg <alex.braunegg@gmail.com> Date: Sat Oct 7 05:28:28 2023 +1100 Update PR * Update PR commit ea1ca333741520ae66d413acf92a71d78eebd32d Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 14:57:51 2023 +1100 Update PR * Update PR commit 1503f969dfa6c8c008f3ccd8bd1cc203bd12e7ee Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 09:19:04 2023 +1100 Update PR * Update PR commit 5127464f2c08942b864b23691e56d73fe9cb9e16 Author: abraunegg <alex.braunegg@gmail.com> Date: Fri Oct 6 06:48:20 2023 +1100 Change when the integrity check is performed * Change when the integrity check is performed commit c7cc45d95c14801d8f616c4a04e0fb030c4e5b02 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 19:40:05 2023 +1100 Update maxInotifyWatches location * Update maxInotifyWatches location commit c44ad963a6e7d2d80eeee7ef82a3ab53d6448486 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:41:31 2023 +1100 Update main.d * Fix --version segfault commit 51f0ffcb1f6a5ae80a1ecb65e4dda9efc2db4f94 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:24:30 2023 +1100 Uplift to v2.5.0-alpha-2 * Uplift to v2.5.0-alpha-2 commit cbe3e6ea845dfe17b909141b2c87fbfae8086669 Author: abraunegg <alex.braunegg@gmail.com> Date: Thu Oct 5 17:17:26 2023 +1100 Clean up before onedrive-v2.5.0-alpha-2 * Clean up before onedrive-v2.5.0-alpha-2
2023-10-18 20:31:50 +02:00
synchronized(bufferLock) {
foreach (level; levels) {
// Normal application output
if (!debugLogging) {
if ((level == "info") || ((verboseLogging) && (level == "verbose")) || (level == "logFileOnly") || (level == "consoleOnly") || (level == "consoleOnlyNoNewLine")) {
// Add this message to the buffer, with this format
buffer ~= [timeStamp, level, format("%s", message)];
}
} else {
// Debug Logging (--verbose --verbose | -v -v | -vv) output
// Add this message, regardless of 'level' to the buffer, with this format
buffer ~= [timeStamp, level, format("DEBUG: %s", message)];
// If there are multiple 'levels' configured, ignore this and break as we are doing debug logging
break;
}
// Submit the message to the dbus / notification daemon for display within the GUI being used
// Will not send GUI notifications when running in debug mode
if ((!debugLogging) && (level == "notify")) {
version(Notifications) {
if (sendGUINotification) {
notify(message);
}
}
}
}
}
}
shared void notify(string message) {
// Use dnotify's functionality for GUI notifications, if GUI notifications is enabled
version(Notifications) {
auto n = new Notification("Log Notification", message, "IGNORED");
n.show();
}
}
private void flushBuffer() {
while (isRunning) {
Thread.sleep(dur!("msecs")(200));
flush();
}
}
private void flush() {
string[3][] messages;
synchronized(bufferLock) {
messages = buffer;
buffer.length = 0;
}
foreach (msg; messages) {
// timestamp, logLevel, message
// Always write the log line to the console, if level != logFileOnly
if (msg[1] != "logFileOnly") {
// Console output .. what sort of output
if (msg[1] == "consoleOnlyNoNewLine") {
// This is used write out a message to the console only, without a new line
// This is used in non-verbose mode to indicate something is happening when downloading JSON data from OneDrive or when we need user input from --resync
write(msg[2]);
} else {
// write this to the console with a new line
writeln(msg[2]);
}
}
// Was this just console only output?
if ((msg[1] != "consoleOnlyNoNewLine") && (msg[1] != "consoleOnly")) {
// Write to the logfile only if configured to do so - console only items should not be written out
if (writeToFile) {
string logFileLine = format("[%s] %s", msg[0], msg[2]);
std.file.append(logFilePath, logFileLine ~ "\n");
}
}
}
}
}
// Function to initialize the logging system
void initialiseLogging(bool verboseLogging = false, bool debugLogging = false) {
logBuffer = cast(shared) new LogBuffer(verboseLogging, debugLogging);
}
// Function to add a log entry with multiple levels
void addLogEntry(string message = "", string[] levels = ["info"]) {
logBuffer.logThisMessage(message, levels);
}
// Function to set logFilePath and enable logging to a file
void enableLogFileOutput(string configuredLogFilePath) {
logBuffer.logFilePath = configuredLogFilePath;
logBuffer.writeToFile = true;
}
void disableGUINotifications(bool userConfigDisableNotifications) {
logBuffer.sendGUINotification = userConfigDisableNotifications;
}