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 }