From e5f6ab5c4d366e6c5fc0ebd746c119064566b212 Mon Sep 17 00:00:00 2001 From: Alexander Zhirov Date: Thu, 1 Jun 2023 18:23:07 +0300 Subject: [PATCH] v0.3.2 - Printing information about the type of the logged message to the standard output stream and file - Printing the date and time to the standard output stream --- CHANGELOG.md | 5 +++++ README.md | 4 +++- source/singlog.d | 20 +++++++++++--------- tests/output.png | Bin 0 -> 22363 bytes 4 files changed, 19 insertions(+), 10 deletions(-) create mode 100644 tests/output.png diff --git a/CHANGELOG.md b/CHANGELOG.md index 2ba884f..90e1f38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +## [v0.3.2](https://git.zhirov.kz/dlang/singlog/compare/v0.3.1...v0.3.2) (2023.06.01) + +- Printing information about the type of the logged message to the standard output stream and file +- Printing the date and time to the standard output stream + ## [v0.3.1](https://git.zhirov.kz/dlang/singlog/compare/v0.3.0...v0.3.1) (2023.05.30) ### Bug fixes diff --git a/README.md b/README.md index 8d57452..039b392 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,8 @@ void main(string[] argv) { } ``` +![output](tests/output.png) + ## Examples Setting the name of the logged program (it matters for Windows OS): @@ -75,4 +77,4 @@ log.d("Debugging message") => log.debugging("Debugging message"); ## DUB -Add a dependency on `"singlog": "~>0.3.1"`. +Add a dependency on `"singlog": "~>0.3.2"`. diff --git a/source/singlog.d b/source/singlog.d index 30976db..0202885 100644 --- a/source/singlog.d +++ b/source/singlog.d @@ -109,11 +109,13 @@ version(Windows) { int msgOutput = STDOUT; int msgLevel = INFORMATION; - void writeLog(string message, int msgLevel) { + void writeLog(string message, string type, int msgLevel) { if (this.msgLevel > msgLevel) return; if (this.msgOutput & 1) syslog(sysLevel[msgLevel], message.toStringz()); + if (this.msgOutput & 6) + message = format("%s [%s]: %s", Clock.currTime().format("%Y.%m.%d %H:%M:%S"), type, message); if (this.msgOutput & 2) writeln(message); if (this.msgOutput & 4) @@ -142,7 +144,7 @@ version(Windows) { } try { - file.writeln(Clock.currTime().format("%Y.%m.%d %H:%M:%S: ") ~ message); + file.writeln(message); } catch (Exception e) { this.writeToFile = false; this.error("Unable to write to the log file " ~ this.path); @@ -173,13 +175,13 @@ public: Log file(string path) { this.path = path; return this.log; } Log level(int msgLevel) { this.msgLevel = msgLevel; return this.log; } - void alert(T)(T message) { writeLog(message.to!string, ALERT); } - void critical(T)(T message) { writeLog(message.to!string, CRITICAL); } - void error(T)(T message) { writeLog(message.to!string, ERROR); } - void warning(T)(T message) { writeLog(message.to!string, WARNING); } - void notice(T)(T message) { writeLog(message.to!string, NOTICE); } - void information(T)(T message) { writeLog(message.to!string, INFORMATION); } - void debugging(T)(T message) { writeLog(message.to!string, DEBUGGING); } + void alert(T)(T message) { writeLog(message.to!string, "ALERT", ALERT); } + void critical(T)(T message) { writeLog(message.to!string, "CRITICAL", CRITICAL); } + void error(T)(T message) { writeLog(message.to!string, "ERROR", ERROR); } + void warning(T)(T message) { writeLog(message.to!string, "WARNING", WARNING); } + void notice(T)(T message) { writeLog(message.to!string, "NOTICE", NOTICE); } + void information(T)(T message) { writeLog(message.to!string, "INFORMATION", INFORMATION); } + void debugging(T)(T message) { writeLog(message.to!string, "DEBUGGING", DEBUGGING); } alias a = alert; alias c = critical; diff --git a/tests/output.png b/tests/output.png new file mode 100644 index 0000000000000000000000000000000000000000..7d024e3364af1223beb8a6894504e376acba7b84 GIT binary patch literal 22363 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