PluginProbe
DecaLog / 4.4.0
DecaLog v4.4.0
3.0.2 3.1.0 3.10.0 3.2.0 3.3.0 3.4.0 3.4.1 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.6.3 3.7.0 3.7.1 3.8.0 3.9.0 3.9.1 4.0.0 4.1.0 4.2.0 4.3.0 4.3.1 4.4.0 4.5.0 All 75 releases
decalog / includes / formatters / class-wordpressformatter.php

class-wordpressformatter.php in DecaLog 4.4.0, at includes/formatters/class-wordpressformatter.php

160 lines 5.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php declare(strict_types=1);
2 /**
3 * WordPress formatter for Monolog
4 *
5 * Handles all features of WordPress formatter for Monolog.
6 *
7 * @package Formatters
8 * @author Pierre Lannoy <https://pierre.lannoy.fr/>.
9 * @since 1.0.0
10 */
11
12 namespace Decalog\Formatter;
13
14 use Decalog\Plugin\Feature\ClassTypes;
15 use Decalog\Plugin\Feature\EventTypes;
16 use Decalog\System\Http;
17 use DLMonolog\Formatter\FormatterInterface;
18
19 /**
20 * Define the Monolog WordPress formatter.
21 *
22 * Handles all features of WordPress formatter for Monolog.
23 *
24 * @package Formatters
25 * @author Pierre Lannoy <https://pierre.lannoy.fr/>.
26 * @since 1.0.0
27 */
28 class WordpressFormatter implements FormatterInterface {
29
30 /**
31 * Formats a log record.
32 *
33 * @param array $record A record to format.
34 * @return string The formatted record.
35 * @since 1.0.0
36 */
37 public function format( array $record ): string {
38 $message = [];
39 $values = array();
40 $values['timestamp'] = date( 'Y-m-d H:i:s' );
41 if ( array_key_exists( 'level', $record ) ) {
42 if ( array_key_exists( $record['level'], EventTypes::$level_names ) ) {
43 $values['level'] = strtolower( EventTypes::$level_names[ $record['level'] ] );
44 }
45 }
46 if ( array_key_exists( 'channel', $record ) ) {
47 $values['channel'] = strtolower( $record['channel'] );
48 }
49 if ( array_key_exists( 'message', $record ) ) {
50 $values['message'] = substr( $record['message'], 0, 65000 );
51 }
52 // Context formatting.
53 if ( array_key_exists( 'context', $record ) ) {
54 $context = $record['context'];
55 if ( array_key_exists( 'class', $context ) ) {
56 if ( in_array( $context['class'], ClassTypes::$classes, true ) ) {
57 $values['class'] = strtolower( $context['class'] );
58 }
59 }
60 if ( array_key_exists( 'component', $context ) ) {
61 $values['component'] = substr( $context['component'], 0, 26 );
62 }
63 if ( array_key_exists( 'version', $context ) ) {
64 $values['version'] = substr( $context['version'], 0, 13 );
65 }
66 if ( array_key_exists( 'code', $context ) ) {
67 $values['code'] = (int) $context['code'];
68 }
69 if ( array_key_exists( 'instance', $context ) && is_string( $context['instance'] ) ) {
70 $values['instance'] = substr( $context['instance'], 0, 66 );
71 }
72 }
73 // Extra formatting.
74 if ( array_key_exists( 'extra', $record ) ) {
75 $extra = $record['extra'];
76 if ( array_key_exists( 'siteid', $extra ) ) {
77 $values['site_id'] = (int) $extra['siteid'];
78 }
79 if ( array_key_exists( 'sitename', $extra ) && is_string( $extra['sitename'] ) ) {
80 $values['site_name'] = substr( $extra['sitename'], 0, 250 );
81 }
82 if ( array_key_exists( 'userid', $extra ) && is_scalar( $extra['userid'] ) ) {
83 $values['user_id'] = substr( (string) $extra['userid'], 0, 66 );
84 }
85 if ( array_key_exists( 'username', $extra ) && is_string( $extra['username'] ) ) {
86 $values['user_name'] = substr( $extra['username'], 0, 250 );
87 }
88 if ( array_key_exists( 'usersession', $extra ) && is_scalar( $extra['usersession'] ) ) {
89 $values['user_session'] = substr( (string) $extra['usersession'], 0, 64 );
90 }
91 if ( array_key_exists( 'ip', $extra ) && is_string( $extra['ip'] ) ) {
92 $values['remote_ip'] = substr( $extra['ip'], 0, 66 );
93 }
94 if ( array_key_exists( 'url', $extra ) && is_string( $extra['url'] ) ) {
95 $values['url'] = substr( $extra['url'], 0, 2083 );
96 }
97 if ( array_key_exists( 'http_method', $extra ) && is_string( $extra['http_method'] ) ) {
98 if ( in_array( strtolower( $extra['http_method'] ), Http::$verbs, true ) ) {
99 $values['verb'] = strtolower( $extra['http_method'] );
100 }
101 }
102 if ( array_key_exists( 'server', $extra ) && is_string( $extra['server'] ) ) {
103 $values['server'] = substr( $extra['server'], 0, 250 );
104 }
105 if ( array_key_exists( 'referrer', $extra ) && $extra['referrer'] && is_string( $extra['referrer'] ) ) {
106 $values['referrer'] = substr( $extra['referrer'], 0, 250 );
107 }
108 if ( array_key_exists( 'ua', $extra ) && $extra['ua'] && is_string( $extra['ua'] ) ) {
109 $values['user_agent'] = substr( $extra['ua'], 0, 1024 );
110 }
111 if ( array_key_exists( 'file', $extra ) && $extra['file'] && is_string( $extra['file'] ) ) {
112 $values['file'] = substr( $extra['file'], 0, 250 );
113 }
114 if ( array_key_exists( 'line', $extra ) && $extra['line'] ) {
115 $values['line'] = (int) $extra['line'];
116 }
117 if ( array_key_exists( 'class', $extra ) && $extra['class'] && is_string( $extra['class'] ) ) {
118 $values['classname'] = substr( $extra['class'], 0, 100 );
119 }
120 if ( array_key_exists( 'function', $extra ) && $extra['function'] && is_string( $extra['function'] ) ) {
121 $values['function'] = substr( $extra['function'], 0, 100 );
122 }
123 if ( array_key_exists( 'trace', $extra ) && $extra['trace'] ) {
124 // phpcs:ignore
125 $s = serialize( $extra['trace'] );
126 if ( strlen( $s ) < 65000 ) {
127 $values['trace'] = $s;
128 } else {
129 $s = [];
130 $s['error'] = 'This backtrace was not recorded: size exceeds limit.';
131 // phpcs:ignore
132 $values['trace'] = serialize( $s );
133 }
134 }
135 }
136 $message[] = $values;
137 // phpcs:ignore
138 return serialize( $message );
139 }
140 /**
141 * Formats a set of log records.
142 *
143 * @param array $records A set of records to format.
144 * @return string The formatted set of records.
145 * @since 1.0.0
146 */
147 public function formatBatch( array $records ): string {
148 $messages = [];
149 foreach ( $records as $record ) {
150 // phpcs:ignore
151 $a = unserialize( $this->format( $record ) );
152 if ( 1 === count( $a ) ) {
153 $messages[] = $a[0];
154 }
155 }
156 // phpcs:ignore
157 return serialize( $messages );
158 }
159 }
160