<?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;
}
}