On Thursday, 15 August 2013 at 17:41:00 UTC, Colin Grogan wrote:
this(LogLevel minLevel = LogLevel.Info, string
fileName="logfile.log")
{
this.minLevel = minLevel;
logFile = File(fileName, "w");
this.writeMsg(format("Opened file for writing at [%s]",
currTimestamp()));
logFile.flush();
scope(exit){
logInfo("End log");
logFile.close();
}
}
This "scope(exit)" runs when you exit the scope, eg: the
_constructor_, not when your log is destroyed. YOur constructor
is basically leaving your log file in a closed state, making it
useless. Instead, use a destroyer:
~this()
{
logInfo("End log");
logFile.close();
}
Note though that this will not *actually* work, because since the
destroyer is run during a collection run, you can't allocate, and
logInfo calls format, which allocates.
As a matter of fact, you should avoid calling format at all.
Instead, your "writeMsg" should look like this
void writeMsg(Args...)(string fmt, Args args){
logFile.writefln(fmt, args);
}
Then, in your log, instead of doing:
this.writeMsg(format("[%s] %s", timestamp, message));
simply do:
this.writeMsg("[%s] %s", timestamp, message);
This doesn't fix everything though, and you should also rework
your "logLevel" functions to not allocate: For example, by making
"log" accept two strings.