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