* Added vertical rendering to com.noccy.pdo.shell * Added missing Log classes for com.noccy.apiclient
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace SparkPlug\Com\Noccy\ApiClient\Log;
 | 
						|
 | 
						|
use JsonSerializable;
 | 
						|
use Psr\Http\Message\ResponseInterface;
 | 
						|
use SparkPlug\Com\Noccy\ApiClient\Log\RequestData as LogRequestData;
 | 
						|
use SparkPlug\Com\Noccy\ApiClient\Request\Request;
 | 
						|
 | 
						|
 | 
						|
class RequestLog
 | 
						|
{
 | 
						|
    private ?string $lastLog = null;
 | 
						|
 | 
						|
    private string $filename;
 | 
						|
 | 
						|
    private array $append = [];
 | 
						|
 | 
						|
    const MAX_EVENTS_PER_FILE = 100;
 | 
						|
 | 
						|
    public function __construct(string $logfile)
 | 
						|
    {
 | 
						|
        $this->filename = $logfile;
 | 
						|
    }
 | 
						|
 | 
						|
    public function append(RequestData $request)
 | 
						|
    {
 | 
						|
        $this->append[] = $request;
 | 
						|
    }
 | 
						|
 | 
						|
    public function flush()
 | 
						|
    {
 | 
						|
        if (file_exists($this->filename)) {
 | 
						|
            $log = json_decode(file_get_contents($this->filename), true);
 | 
						|
        } else {
 | 
						|
            $log = [
 | 
						|
                'lastlog' => null,
 | 
						|
                'events' => []
 | 
						|
            ];
 | 
						|
        }
 | 
						|
        while (count($this->append) > 0) {
 | 
						|
            $append = array_shift($this->append);
 | 
						|
            array_push($log['events'], $append);
 | 
						|
            $json = json_encode($log, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
 | 
						|
            if (count($log['events']) >= self::MAX_EVENTS_PER_FILE) {
 | 
						|
                do {
 | 
						|
                    $newlog = sprintf("%s.%04x", $this->filename, rand(0,65535));
 | 
						|
                } while (file_exists($newlog));
 | 
						|
                file_put_contents($newlog, $json);
 | 
						|
                $log['lastlog'] = basename($newlog);
 | 
						|
                $log['events'] = [];
 | 
						|
            } else {
 | 
						|
                file_put_contents($this->filename."~", $json);
 | 
						|
                if (filesize($this->filename."~") > 0) {
 | 
						|
                    rename($this->filename."~", $this->filename);
 | 
						|
                } else {
 | 
						|
                    fprintf(STDERR, "error: Null size log writing requestlog %s\n", $this->filename);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
}
 |