1 /** 2 * Default logger 3 */ 4 module dlog.defaults; 5 6 import dlog.core : Logger; 7 import dlog.transform : MessageTransform; 8 import dlog.context : Context, CompilationInfo; 9 import std.conv : to; 10 11 /** 12 * DefaultLogger 13 * 14 * The default logger logs to standard output (fd 0) 15 */ 16 public final class DefaultLogger : Logger 17 { 18 /** 19 * Constructs a new default logger 20 * 21 * Params: 22 * multiArgJoiner = the joiner to use 23 */ 24 this(string multiArgJoiner = " ") 25 { 26 /* Use the DefaultTransform */ 27 super(multiArgJoiner); 28 } 29 30 /** 31 * Our logging implementation 32 */ 33 protected override void logImpl(string message) 34 { 35 import std.stdio : write; 36 write(message); 37 } 38 } 39 40 /** 41 * DefaultTransform 42 * 43 * Provides a transformation of the kind 44 * 45 * [date+time] (srcFile:lineNumber): message `\n` 46 */ 47 public final class DefaultTransform : MessageTransform 48 { 49 /** 50 * Performs the default transformation 51 * 52 * Params: 53 * text = text input to transform 54 * context = the context (if any) 55 * Returns: the transformed text 56 */ 57 public override string transform(string text, Context ctx) 58 { 59 /* Extract the context */ 60 string[] context = ctx.getLineInfo().toArray(); 61 62 string message; 63 64 /* Date and time */ 65 import std.datetime.systime : Clock, SysTime; 66 SysTime currTime = Clock.currTime(); 67 import std.conv : to; 68 string timestamp = to!(string)(currTime); 69 message = "["~timestamp~"]"; 70 71 /* Module information */ 72 message = message ~ "\t("; 73 message = message ~ context[1]~":"~context[2]; 74 message = message ~ "): "~text; 75 76 /* Add trailing newline */ 77 message = message ~ '\n'; 78 79 return message; 80 } 81 }