PluginProbe
YayMail – WooCommerce Email Customizer / trunk
YayMail – WooCommerce Email Customizer vtrunk
4.4.4 4.4.3 4.4.2 4.4.1 trunk 1.9.6 2.1.4 2.1.5 3.2.2 3.2.6 3.2.7.1 3.2.8.1 3.2.9 3.3 3.3.1 3.3.4 3.3.5 3.3.6 3.3.7 3.3.8 3.3.9 3.4 3.4.1 3.4.2 3.4.3 All 55 releases
yaymail / src / Utils / Logger.php

Logger.php in YayMail – WooCommerce Email Customizer trunk, at src/Utils/Logger.php

145 lines 5.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace YayMail\Utils;
4
5 /**
6 * Logger
7 */
8 class Logger {
9 private $log_directory;
10 private $wp_filesystem;
11 private $max_log_files;
12
13 /**
14 * Constructor for the Logger class.
15 *
16 * Initializes the logger with a specified log directory, prefix for log entries,
17 * and the maximum number of log files to keep. Ensures the log directory exists and
18 * performs cleanup of old log files.
19 */
20 public function __construct( $log_directory = null, $max_log_files = 30 ) {
21 if ( ! $log_directory ) {
22 $log_directory = WP_CONTENT_DIR . '/yaymail-logs';
23 }
24 $this->log_directory = $log_directory;
25 $this->max_log_files = $max_log_files;
26 $this->initialize_filesystem();
27
28 // Ensure the log directory exists (only if filesystem is available)
29 if ( $this->wp_filesystem && ! $this->wp_filesystem->is_dir( $this->log_directory ) ) {
30 $this->wp_filesystem->mkdir( $this->log_directory, 0755 );
31 }
32
33 // Clean up old log files (only if filesystem is available)
34 if ( $this->wp_filesystem ) {
35 $this->cleanup_old_logs();
36 }
37 }
38
39 private function initialize_filesystem() {
40 global $wp_filesystem;
41
42 // Initialize the WordPress filesystem
43 require_once ABSPATH . 'wp-admin/includes/file.php';
44
45 // Try to initialize WP_Filesystem, fallback to direct method if failed
46 if ( ! WP_Filesystem() || ! $wp_filesystem ) {
47 // Fallback to direct filesystem access
48 require_once ABSPATH . 'wp-admin/includes/class-wp-filesystem-direct.php';
49 $this->wp_filesystem = new \WP_Filesystem_Direct( null );
50 } else {
51 $this->wp_filesystem = $wp_filesystem;
52 }
53 }
54
55 private function cleanup_old_logs() {
56 // Return early if filesystem is not available or log directory is not a directory
57 if ( ! $this->wp_filesystem || ! $this->wp_filesystem->is_dir( $this->log_directory ) ) {
58 return;
59 }
60
61 // Get all log files in the directory
62 $files = $this->wp_filesystem->dirlist( $this->log_directory );
63
64 if ( ! is_array( $files ) ) {
65 return;
66 }
67
68 // Filter only log files
69 $log_files = array_filter(
70 $files,
71 function( $file ) {
72 return strpos( $file['name'], '.log' ) !== false;
73 }
74 );
75
76 // Sort log files by name (assuming the name is in the format 'Y-m-d.log')
77 usort(
78 $log_files,
79 function( $a, $b ) {
80 return strcmp( $b['name'], $a['name'] );
81 }
82 );
83
84 // If there are more log files than the allowed maximum, delete the oldest
85 if ( count( $log_files ) > $this->max_log_files ) {
86 $files_to_delete = array_slice( $log_files, $this->max_log_files );
87
88 foreach ( $files_to_delete as $file ) {
89 $this->wp_filesystem->delete( $this->log_directory . '/' . $file['name'] );
90 }
91 }
92 }
93
94 public function log( $message ) {
95 // Return early if filesystem is not available
96 if ( ! $this->wp_filesystem ) {
97 return;
98 }
99
100 // Get the current date to create a log file for each day, based on local time
101 $date = current_time( 'Y-m-d' );
102 $log_file = $this->log_directory . '/' . $date . '.log';
103
104 // Construct the log message with a timestamp based on local time
105 $timestamp = current_time( 'Y-m-d H:i:s' );
106 $log_message = "[$timestamp] $message" . PHP_EOL;
107
108 // Append the log message to the log file
109 if ( $this->wp_filesystem->exists( $log_file ) ) {
110 $existing_content = $this->wp_filesystem->get_contents( $log_file );
111 $log_message = $existing_content . $log_message;
112 }
113
114 $this->wp_filesystem->put_contents( $log_file, $log_message, FS_CHMOD_FILE );
115 }
116
117 /**
118 * Logs an exception message to wp-content/yaymail-logs and returns.
119 *
120 * Does not terminate the request: rendering can be triggered inside another
121 * plugin's request (e.g. WooCommerce checkout AJAX), where dying would break
122 * the host response. Callers that need to abort (YayMail's own AJAX endpoints)
123 * must call wp_send_json_error() themselves.
124 */
125 public function log_exception_message( $ex, $log_type = 'error', $additional_data = null ) {
126 $prefix = ( $log_type === 'warning' ) ? __( 'WARNING:', 'yaymail' ) : __( 'SYSTEM ERROR:', 'yaymail' );
127
128 $message = $prefix . ' ' . $ex->getCode() . ' : ' . $ex->getMessage();
129 $message .= PHP_EOL . $ex->getFile() . '(' . $ex->getLine() . ')';
130 $message .= PHP_EOL . $ex->getTraceAsString();
131
132 // Add additional data if provided
133 if ( $additional_data !== null ) {
134 $message .= PHP_EOL . 'Additional data: ';
135 if ( is_array( $additional_data ) || is_object( $additional_data ) ) {
136 $message .= PHP_EOL . print_r( $additional_data, true );
137 } else {
138 $message .= $additional_data;
139 }
140 }
141
142 $this->log( $message );
143 }
144 }
145