flogger
/
flogger.php
225 строк · 5.6 Кб
1<?php
2
3// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
4
5// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
6// CLASS
7// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
8
9/**
10* @brief
11* File-based logger utility
12*
13* @version 0.1.4
14*/
15final class FLogger
16{
17
18// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
19
20// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
21// CONSTANTS
22// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
23
24/** @var String root-dir */
25private $root_dir;
26
27// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
28// FIELDS
29// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
30
31/** @var FLogger */
32private static $instance = null;
33
34/** @var Array[String] cached file names. */
35private $file_names = [];
36
37/** @var Array[File] */
38private $files = [];
39
40// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
41// CONSTRUCTOR
42// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
43
44private function __constructor()
45{
46$this->root_dir = getcwd();
47
48register_shutdown_function( [$this, 'handleShutdown'] );
49}
50
51// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
52// GETTERS & SETTERS
53// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
54
55/**
56* @brief
57*
58* @param Boolean $alloc = true
59* @return FLogger||NULL
60*/
61public static function getInstance( bool $alloc = true )
62{
63if ( $alloc && empty(self::$instance) ) {
64self::$instance = new FLogger();
65}
66
67return self::$instance;
68}
69
70/**
71* Set new Root-dir
72*
73* @param String $dir
74*/
75public function setRootDir( string $dir )
76{
77if ( $dir[strlen($dir) - 1] !== '/' ) {
78$dir .= '/';
79}
80
81$this->root_dir = $dir;
82}
83
84/**
85* @brief
86* Returns appropriate File instance for context & dir
87*
88* @param String $context
89* @param String $dir
90*
91* @return File
92*/
93private function getFile( $context, $dir )
94{
95if ( empty($this->files[$context]) ) {
96$this->verifyDirs( $dir );
97$file_name = $this->root_dir . $dir . '/' . $this->getLogFile_Name( $context ) . '.log';
98
99return $this->files[$context] = fopen( $file_name, 'a' );
100}
101
102return $this->files[$context];
103}
104
105/**
106* @brief
107* Build date-time mark for file-name
108*
109* @return String
110*/
111private function getDateMark()
112{
113return date('Y_m_d', time() );
114}
115
116/**
117* @brief
118* Build log-file name
119*
120* @param String $context
121*
122* @return String
123*/
124private function getLogFile_Name( $context )
125{
126if ( empty($this->file_names[$context]) ) {
127$output = $this->file_names[$context] = $context.'_'.$this->getDateMark();
128} else {
129$output = $this->file_names[$context];
130}
131
132return $output;
133}
134
135// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
136// METHODS.PUBLIC
137// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
138
139/**
140* @brief
141* Called when script ends
142*/
143public function handleShutdown(): void
144{
145$instance = self::getInstance( false );
146$instance->close();
147}
148
149public static function info( $msg, $context = 'core', $dir = 'log' )
150{
151self::print( "GOOD: {$msg}", $context, $dir );
152}
153
154public static function verbose( $msg, $context = 'core', $dir = 'log' )
155{
156self::print( "VERBOSE: .{$msg}", $context, $dir );
157}
158
159public static function warning( $msg, $context = 'core', $dir = 'log' )
160{
161self::print( "WARNING: {$msg}", $context, $dir );
162}
163
164public static function error( $msg, $context = 'core', $dir = 'log' )
165{
166self::print( "FATAL_ERROR: {$msg}", $context, $dir );
167}
168
169/**
170* @brief
171* Append output for file
172*
173* @param String $msg
174* @param String $context = 'core'
175* @param String $dir = 'log'
176*/
177private static function print( $msg, $context = 'core', $dir = 'log' ): void
178{
179$instance = self::getInstance();
180$file = $instance->getFile( $context, $dir );
181$dt_mark = date( 'Y-m-d H:i:s' );
182fwrite( $file, $dt_mark.PHP_EOL.$msg.PHP_EOL );
183}
184
185// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
186// METHODS.PRIVATE
187// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
188
189/**
190* @brief
191* Build missing dirs in the path
192*
193* @param String $path
194*/
195private function verifyDirs( $path ): void
196{
197if ( !file_exists($this->root_dir . $path) ) {
198try {
199mkdir( $this->root_dir . $path, 0777, true );
200} catch( Exception $exception ) {
201/* - void - */
202} finally { /* - void - */ }
203}
204}
205
206/**
207* @brief
208* Close/flush output files
209*/
210private function close(): void
211{
212if ( !empty($this->files) ) {
213foreach( $this->files as &$file )
214{
215fclose( $file );
216}
217}
218}
219
220// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
221
222};
223class_alias( FLogger::class, 'MyLogger' );
224
225// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
226