Newer
Older
smart-home-server / server / Fury / Kernel / Logging.php
<?php

namespace Fury\Kernel;

/**
 * Class for free logging
 */

class Logging extends \Fury\Libs\Singleton{
	/**
	 * Storage for session logs
	 *
	 * @var arrray
	 */
	protected $storage;

	/**
	 * Unique ID of SESSION
	 *
	 * @var string
	 */
	protected $session_id;

	/**
	 * Path to folder with logs
	 *
	 * @var string
	 */
	public $logs_folder;

	public function __construct(){
		if(!FCONF['logs_enable'])
				return false;

		$this -> storage = [];
		$this -> session_id = uniqid();
		$this -> logs_folder = FCONF['logs_folder'];
	}

	/**
	 * Set new log item
	 *
	 * @method set
	 *
	 * @param  string $place String in format "Classname@methname" or "funcname"
	 * @param  string $title Title of log. 
	 * @param  string $message Any text message
	 */
	public function set($place, $title, $message){
		if(!FCONF['logs_enable'])
				return false;

		if(strpos($place, '@') === false){
			$class = '';
			$meth = $place;
		}else{
			list($class, $meth) = explode('@', $place);
		}

		$this -> storage[] = [
			'class' => $class,
			'meth' => $meth,
			'title' => $title,
			'message' => $message,
			'timestamp' => microtime(true)
		];

		return true;
	}


	/**
	 * Dumping session logs to json file
	 *
	 * @method dump
	 *
	 * @return boolean Result of writing to log file
	 */
	public function dump(){
		$log_filename = date('d.m.Y') . '.log.json';
		$path_to_log_file = $this -> logs_folder . '/' . $log_filename;
		$session = [
			'session_id' => $this -> session_id,
			'timestamp' => microtime(true),
			'logs' => $this -> storage
		];

		if(!is_dir($this -> logs_folder)){
			mkdir($this -> logs_folder, 0750, true);
		}

		$fp = fopen($path_to_log_file, 'c+');
		if($fp === false) {
			return false;
		}

		if(!flock($fp, LOCK_EX)) {
			fclose($fp);
			return false;
		}

		$raw = stream_get_contents($fp);
		$logs = $raw ? json_decode($raw, true) : [];
		if(!is_array($logs)) {
			$logs = [];
		}
		$logs[] = $session;

		ftruncate($fp, 0);
		rewind($fp);
		$result = fwrite($fp, json_encode($logs, JSON_UNESCAPED_SLASHES|JSON_PRETTY_PRINT));
		fflush($fp);
		flock($fp, LOCK_UN);
		fclose($fp);

		chmod($path_to_log_file, 0640);

		return $result !== false;
	}
}