PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.7.6
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.7.6
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / logging.php
ai-engine / classes Last commit date
engines 1 year ago modules 1 year ago queries 1 year ago admin.php 2 years ago api.php 1 year ago core.php 1 year ago discussion.php 1 year ago init.php 2 years ago logging.php 1 year ago reply.php 1 year ago rest.php 1 year ago
logging.php
191 lines
1 <?php
2
3 class Meow_MWAI_Logging {
4 private static $plugin_name;
5 private static $option_name;
6 private static $log_file_path;
7 private static $log_count = 0;
8 private static $rotate_check_frequency = 10;
9 private static $max_log_size = 5 * 1024 * 1024; // 5 MB
10
11 /**
12 * Initializes the Meow Logging class.
13 *
14 * @param string $option_name The name of the option where logging settings are stored.
15 * @param string $plugin_name The name of the plugin, used in the PHP Error Logs.
16 */
17 public static function init( $option_name, $plugin_name ) {
18 self::$plugin_name = $plugin_name;
19 self::$option_name = $option_name;
20 self::$log_file_path = self::get_logs_path();
21 }
22
23 private static function add( $message = null, $icon = '', $error_log = false ) {
24 // Log to a local file
25 if ( self::is_logging_enabled() && self::$log_file_path ) {
26 $fh = @fopen( self::$log_file_path, 'a' );
27 if ( $fh ) {
28 $date = date( "Y-m-d H:i:s" );
29 $message = self::sanitize_message( $message );
30 if ( empty( $message ) ) {
31 fwrite( $fh, "\n" );
32 }
33 else {
34 if ( !empty( $icon ) ) {
35 fwrite( $fh, "$date: $icon $message\n" );
36 }
37 else {
38 fwrite( $fh, "$date: $message\n" );
39 }
40 }
41 fclose( $fh );
42 } else {
43 error_log( self::$plugin_name . ": Failed to open log file for writing." );
44 }
45 }
46 // Log to the PHP Error Logs
47 if ( $error_log === true && !empty( $message ) ) {
48 error_log( self::$plugin_name . ": $message" );
49 }
50 self::$log_count++;
51 if ( self::$log_count >= self::$rotate_check_frequency ) {
52 self::maybe_rotate_log();
53 self::$log_count = 0;
54 }
55 }
56
57 /**
58 * Logs an error message.
59 * It will also be logged to the PHP Error Logs.
60 *
61 * @param string $message The error message to log.
62 * @param string $icon An optional icon to prepend to the log message. Default is '❌'.
63 */
64 public static function error( $message = null, $icon = '' ) {
65 self::add( $message, $icon, true );
66 }
67
68 /**
69 * Logs a warning message.
70 *
71 * @param string $message The warning message to log.
72 * @param string $icon An optional icon to prepend to the log message. Default is '⚠️'.
73 */
74 public static function warn( $message = null, $icon = '🥲' ) {
75 self::add( $message, $icon );
76 }
77
78 /**
79 * Logs a general message.
80 *
81 * @param string $message The message to log.
82 * @param string $icon An optional icon to prepend to the log message. Default is empty.
83 */
84 public static function log( $message = null, $icon = '' ) {
85 self::add( $message, $icon );
86 }
87
88 /**
89 * Logs a notice of a deprecated feature.
90 *
91 * @param string $message The message to log.
92 * @param string $icon An optional icon to prepend to the log message. Default is '🐞'.
93 */
94 public static function deprecated( $message = null ) {
95 self::add( $message, '🚨', true );
96 }
97
98 private static function is_logging_enabled() {
99 $options = get_option( self::$option_name, null );
100 if ( is_null( $options ) ) {
101 return false;
102 }
103 $module_devtools = empty( $options['module_devtools'] ) ? false : $options['module_devtools'];
104 $server_debug_mode = empty( $options['server_debug_mode'] ) ? false : $options['server_debug_mode'];
105 return $module_devtools && $server_debug_mode;
106 }
107
108 private static function get_logs_path() {
109 $uploads_dir = wp_upload_dir();
110 $uploads_dir_path = trailingslashit( $uploads_dir['basedir'] );
111 $options = get_option( self::$option_name, null );
112 if ( is_null( $options ) ) {
113 return null;
114 }
115 $path = empty( $options['logs_path'] ) ? null : $options['logs_path'];
116 if ( $path && file_exists( $path ) ) {
117 // Ensure the path is legal (within the uploads directory with the MWAI_PREFIX and log extension)
118 if ( strpos( $path, $uploads_dir_path ) !== 0 ||
119 strpos( $path, MWAI_PREFIX ) === false || substr( $path, -4 ) !== '.log' ) {
120 $path = null;
121 }
122 else {
123 return $path;
124 }
125 }
126 if ( !$path ) {
127 $path = $uploads_dir_path . MWAI_PREFIX . "_" . self::random_ascii_chars() . ".log";
128 if ( !file_exists( $path ) ) {
129 touch( $path );
130 }
131 $options['logs_path'] = $path;
132 update_option( self::$option_name, $options );
133 }
134 return $path;
135 }
136
137 private static function random_ascii_chars( $length = 8 ) {
138 $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
139 $result = '';
140 for ( $i = 0; $i < $length; $i++ ) {
141 $result .= $characters[rand( 0, strlen( $characters ) - 1 )];
142 }
143 return $result;
144 }
145
146 /**
147 * Clears the log file and resets the log path.
148 */
149 public static function clear() {
150 if ( self::$log_file_path ) {
151 if ( substr( self::$log_file_path, -4 ) === '.log' ) {
152 unlink( self::$log_file_path );
153 }
154 $options = get_option( self::$option_name, null );
155 if ( $options ) {
156 $options['logs_path'] = null;
157 update_option( self::$option_name, $options );
158 self::$log_file_path = null;
159 }
160 }
161 }
162
163 /**
164 * Retrieves the contents of the log file.
165 * The lines are returned in reverse order (newest first).
166 */
167 public static function get() {
168 if ( self::$log_file_path && file_exists( self::$log_file_path ) ) {
169 $content = file_get_contents( self::$log_file_path );
170 $lines = explode( "\n", $content );
171 $lines = array_filter( $lines );
172 $lines = array_reverse( $lines );
173 $content = implode( "\n", $lines );
174 return $content;
175 }
176 return 'Empty log file.';
177 }
178
179 private static function maybe_rotate_log() {
180 if ( file_exists( self::$log_file_path ) && filesize( self::$log_file_path ) > self::$max_log_size ) {
181 $info = pathinfo( self::$log_file_path );
182 $new_name = $info['dirname'] . '/' . $info['filename'] . '_' . date( 'Y-m-d_H-i-s' ) . '.' . $info['extension'];
183 rename( self::$log_file_path, $new_name );
184 touch( self::$log_file_path );
185 }
186 }
187
188 private static function sanitize_message( $message ) {
189 return is_string( $message ) ? strip_tags( $message ) : $message;
190 }
191 }