<?php
/**
* ファイルに出力するロガークラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class charcoal_FileLogger implements charcoal_ILogger
{
	private $_open;
	private $_fp;
	private $_file_name;

	/*
	 * コンストラクタ
	 */
	public function __construct()
	{
		$this->_open = false;
		$this->_fp = null;
		$this->_file_name = null;
	}

	/*
	 * デストラクタ
	 */
	public function __destruct()
	{
		$this->close();
	}

	/*
	 * ロガー名
	 */
	public function getLoggerName(){
		return "File Logger";
	}

	/*
	 * ロガーを初期化
	 */
	public function init( charcoal_Config $config )
	{
		$file_name = $config->getString( 'file_name' );
		$file_name = charcoal_ResourceLocator::getWebAppPath( 'logs', $file_name );
		$this->_file_name = $file_name;
	}

	/*
	 * ファイル名を取得
	 */
	public function getFileName(){
		return $this->_file_name;
	}

	/*
	 * ファイルがオープンされているか
	 */
	public function isOpen()
	{
		return $this->_open;
	}

	/*
	 * ファイルをオープンする
	 */
	public function open()
	{
		// すでに開いているならなにもしない
		if ( $this->_open ){
			return;
		}
		$this->_fp = fopen($this->_file_name, "a");
		$this->_open = true;
	}

	/*
	 * ファイルを閉じる
	 */
	public function close()
	{
		if ( $this->_fp != null ){
			fclose ($this->_fp);
			$this->_fp = null;
		}
		$this->_open = false;
	}

	/*
	 * 一行出力
	 */
	public function writeln( $key, $level, $message, $file, $line )
	{
		$this->open();

		$time = date("Y/m/d H:i:s");
		$file = basename($file);

		// エンコーディング変換
		$conv = charcoal_EncodingConverter::fromString( 'PHP_TO_LOG' );
		$message = $conv->convertEncoding( $message );

		// 接続処理
		$this->open();

		// ファイル書き込み
		fwrite ($this->_fp, "[$time] $message                                 @$file($line) \n"); 
	}

	/**
	 * 文字列化
	 */
	public function __toString()
	{
		return $this->getLoggerName();
	}
}
