module logging.sinks.FileLogSink;

import std.datetime;
import std.stdio;
import logging.sinks.LogSink;
import logging.formatters;

public class FileLogSink : LogSinkBase
{
	private File _file;

	public this(string filename, Formatter fmt = null)
	{
		_file.open(filename, "a");
		_file.setvbuf(300, _IOLBF);

		if(fmt is null)
		{
			fmt = new TimedThreadedFormatter;
		}

		_formatter = fmt;
	}

	public override void _log(LogLevel loglevel, string m, string func, size_t line, SysTime time, string msg, uint thread_id)
	{
		auto fmsg = _formatter.format(loglevel, m, func, line, time, msg, thread_id);
		_file.writeln(fmsg);
	}

	public void formatter(Formatter fmt) @property
	{
		_formatter = fmt;
	}

	private Formatter _formatter;
}