flogger

Форк
0
/
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
 */
15
final class FLogger
16
{
17

18
    // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
19
	
20
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
21
    //                        CONSTANTS
22
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
23

24
    /** @var String root-dir */
25
    private $root_dir;
26

27
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
28
    //                          FIELDS
29
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
30
    
31
    /** @var FLogger */
32
    private static $instance = null;
33

34
    /** @var Array[String] cached file names. */
35
    private $file_names = [];
36

37
    /** @var Array[File] */
38
    private $files = [];
39

40
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
41
    //                        CONSTRUCTOR
42
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
43

44
    private function __constructor()
45
    {
46
        $this->root_dir = getcwd();
47

48
        register_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
    */
61
    public static function getInstance( bool $alloc = true )
62
    {
63
        if ( $alloc && empty(self::$instance) ) {
64
            self::$instance = new FLogger();
65
        }
66

67
        return self::$instance;
68
    }
69

70
    /**
71
     * Set new Root-dir
72
     * 
73
     * @param String $dir
74
    */
75
    public function setRootDir( string $dir )
76
    {
77
        if ( $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
    */
93
    private function getFile( $context, $dir )
94
    {
95
        if ( empty($this->files[$context]) ) {
96
            $this->verifyDirs( $dir );
97
            $file_name = $this->root_dir . $dir . '/' . $this->getLogFile_Name( $context ) . '.log';
98

99
            return $this->files[$context] = fopen( $file_name, 'a' );
100
        }
101
        
102
        return $this->files[$context];
103
    }
104

105
    /**
106
     * @brief
107
     * Build date-time mark for file-name
108
     * 
109
     * @return String
110
    */
111
    private function getDateMark()
112
    {
113
        return 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
    */
124
    private function getLogFile_Name( $context )
125
    {
126
        if ( empty($this->file_names[$context]) ) {
127
            $output = $this->file_names[$context] = $context.'_'.$this->getDateMark();
128
        } else {
129
            $output = $this->file_names[$context];
130
        }
131
        
132
        return $output;
133
    }
134

135
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
136
    //                       METHODS.PUBLIC
137
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
138

139
    /**
140
     * @brief
141
     * Called when script ends
142
    */
143
    public function handleShutdown(): void
144
    {
145
        $instance = self::getInstance( false );
146
        $instance->close();
147
    }
148

149
    public static function info( $msg, $context = 'core', $dir = 'log' )
150
    {
151
        self::print( "GOOD: {$msg}", $context, $dir );
152
    }
153

154
    public static function verbose( $msg, $context = 'core', $dir = 'log' )
155
    {
156
        self::print( "VERBOSE: .{$msg}", $context, $dir );
157
    }
158

159
    public static function warning( $msg, $context = 'core', $dir = 'log' )
160
    {
161
        self::print( "WARNING: {$msg}", $context, $dir );
162
    }
163

164
    public static function error( $msg, $context = 'core', $dir = 'log' )
165
    {
166
        self::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
    */
177
    private 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' );
182
        fwrite( $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
    */
195
    private function verifyDirs( $path ): void
196
    {
197
        if ( !file_exists($this->root_dir . $path) ) {
198
            try {
199
                mkdir( $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
    */
210
    private function close(): void
211
    {
212
        if ( !empty($this->files) ) {
213
            foreach( $this->files as &$file )
214
            {
215
                fclose( $file );
216
            }
217
        }
218
    }
219

220
    // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
221

222
};
223
class_alias( FLogger::class, 'MyLogger' );
224

225
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
226

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.