7
7
8
8
namespace Magento \MagentoCloud \App \Logger ;
9
9
10
- use Illuminate \Contracts \Config \Repository ;
11
10
use Magento \MagentoCloud \App \Logger \Gelf \HandlerFactory as GelfHandlerFactory ;
11
+ use Magento \MagentoCloud \App \LoggerException ;
12
+ use Magento \MagentoCloud \Config \ConfigException ;
12
13
use Magento \MagentoCloud \Config \GlobalSection ;
13
14
use Magento \MagentoCloud \Config \Log as LogConfig ;
14
- use Monolog \Handler \HandlerInterface ;
15
+ use Monolog \Handler \AbstractProcessingHandler ;
15
16
use Monolog \Handler \NativeMailerHandler ;
16
17
use Monolog \Handler \SlackHandler ;
17
18
use Monolog \Handler \StreamHandler ;
18
19
use Monolog \Handler \SyslogHandler ;
19
20
use Monolog \Handler \SyslogUdpHandler ;
21
+ use Monolog \Logger ;
20
22
21
23
/**
22
24
* The handler factory.
25
+ *
26
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
23
27
*/
24
28
class HandlerFactory
25
29
{
26
- const HANDLER_STREAM = 'stream ' ;
27
- const HANDLER_FILE = 'file ' ;
28
- const HANDLER_FILE_ERROR = 'file_errors ' ;
29
- const HANDLER_EMAIL = 'email ' ;
30
- const HANDLER_SLACK = 'slack ' ;
31
- const HANDLER_GELF = 'gelf ' ;
32
- const HANDLER_SYSLOG = 'syslog ' ;
33
- const HANDLER_SYSLOG_UDP = 'syslog_udp ' ;
30
+ private const UNDEFINED_LEVEL = 0 ;
34
31
35
- /**
36
- * @var LevelResolver
37
- */
38
- private $ levelResolver ;
32
+ public const HANDLER_STREAM = 'stream ' ;
33
+ public const HANDLER_FILE = 'file ' ;
34
+ public const HANDLER_FILE_ERROR = 'file_errors ' ;
35
+ public const HANDLER_EMAIL = 'email ' ;
36
+ public const HANDLER_SLACK = 'slack ' ;
37
+ public const HANDLER_GELF = 'gelf ' ;
38
+ public const HANDLER_SYSLOG = 'syslog ' ;
39
+ public const HANDLER_SYSLOG_UDP = 'syslog_udp ' ;
39
40
40
41
/**
41
42
* @var LogConfig
@@ -53,99 +54,129 @@ class HandlerFactory
53
54
private $ globalConfig ;
54
55
55
56
/**
56
- * @param LevelResolver $levelResolver
57
57
* @param LogConfig $logConfig
58
58
* @param GelfHandlerFactory $gelfHandlerFactory
59
59
* @param GlobalSection $globalConfig
60
60
*/
61
61
public function __construct (
62
- LevelResolver $ levelResolver ,
63
62
LogConfig $ logConfig ,
64
63
GelfHandlerFactory $ gelfHandlerFactory ,
65
64
GlobalSection $ globalConfig
66
65
) {
67
- $ this ->levelResolver = $ levelResolver ;
68
66
$ this ->logConfig = $ logConfig ;
69
67
$ this ->gelfHandlerFactory = $ gelfHandlerFactory ;
70
68
$ this ->globalConfig = $ globalConfig ;
71
69
}
72
70
73
71
/**
74
72
* @param string $handler
75
- * @return HandlerInterface
73
+ * @return AbstractProcessingHandler
74
+ * @throws LoggerException
75
+ *
76
76
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
77
77
*/
78
- public function create (string $ handler ): HandlerInterface
78
+ public function create (string $ handler ): AbstractProcessingHandler
79
79
{
80
- $ configuration = $ this ->logConfig ->get ($ handler );
81
- $ levelOverride = $ this ->globalConfig ->get (GlobalSection::VAR_MIN_LOGGING_LEVEL );
82
- $ defaultLevel = $ levelOverride ?: LogConfig::LEVEL_NOTICE ;
83
- $ minLevel = $ this ->levelResolver ->resolve ($ configuration ->get ('min_level ' , $ defaultLevel ));
84
-
85
- switch ($ handler ) {
86
- case static ::HANDLER_FILE :
87
- $ handlerInstance = new StreamHandler (
88
- $ configuration ->get ('file ' ),
89
- $ this ->levelResolver ->resolve ($ configuration ->get ('min_level ' , LogConfig::LEVEL_DEBUG ))
90
- );
91
- break ;
92
- case static ::HANDLER_FILE_ERROR :
93
- $ handlerInstance = new StreamHandler (
94
- $ configuration ->get ('file ' ),
95
- $ this ->levelResolver ->resolve ($ configuration ->get ('min_level ' , LogConfig::LEVEL_WARNING ))
96
- );
97
- break ;
98
- case static ::HANDLER_STREAM :
99
- $ defaultLevelStream = $ levelOverride ?: LogConfig::LEVEL_INFO ;
100
- $ handlerInstance = new StreamHandler (
101
- $ configuration ->get ('stream ' ),
102
- $ this ->levelResolver ->resolve ($ configuration ->get ('min_level ' , $ defaultLevelStream ))
103
- );
104
- break ;
105
- case static ::HANDLER_EMAIL :
106
- $ handlerInstance = new NativeMailerHandler (
107
- $ configuration ->get ('to ' ),
108
- $ configuration ->get ('subject ' , 'Log from Magento Cloud ' ),
109
- $ configuration ->get ('from ' ),
110
- $ minLevel
111
- );
112
- break ;
113
- case static ::HANDLER_SLACK :
114
- $ handlerInstance = new SlackHandler (
115
- $ configuration ->get ('token ' ),
116
- $ configuration ->get ('channel ' , 'general ' ),
117
- $ configuration ->get ('username ' , 'Slack Log Notifier ' ),
118
- true ,
119
- null ,
120
- $ minLevel
121
- );
122
- break ;
123
- case static ::HANDLER_SYSLOG :
124
- $ handlerInstance = new SyslogHandler (
125
- $ configuration ->get ('ident ' ),
126
- $ configuration ->get ('facility ' , LOG_USER ),
127
- $ minLevel ,
128
- true ,
129
- $ configuration ->get ('logopts ' , LOG_PID )
130
- );
131
- break ;
132
- case static ::HANDLER_SYSLOG_UDP :
133
- $ handlerInstance = new SyslogUdpHandler (
134
- $ configuration ->get ('host ' ),
135
- $ configuration ->get ('port ' ),
136
- $ configuration ->get ('facility ' , LOG_USER ),
137
- $ minLevel ,
138
- true ,
139
- $ configuration ->get ('ident ' , 'php ' )
140
- );
141
- break ;
142
- case static ::HANDLER_GELF :
143
- $ handlerInstance = $ this ->gelfHandlerFactory ->create ($ configuration , $ minLevel );
144
- break ;
145
- default :
146
- throw new \Exception ('Unknown type of log handler: ' . $ handler );
80
+ try {
81
+ $ levelOverride = $ this ->globalConfig ->get (GlobalSection::VAR_MIN_LOGGING_LEVEL );
82
+ $ minLevel = !empty ($ levelOverride ) ? $ this ->normalizeLevel ($ levelOverride ) : self ::UNDEFINED_LEVEL ;
83
+
84
+ $ configuration = $ this ->logConfig ->get ($ handler );
85
+ } catch (ConfigException $ exception ) {
86
+ throw new LoggerException ($ exception ->getMessage (), $ exception ->getCode (), $ exception );
87
+ }
88
+
89
+ if ($ customMinLevel = $ configuration ->get ('min_level ' )) {
90
+ $ minLevel = $ this ->normalizeLevel ((string )$ customMinLevel );
91
+ }
92
+
93
+ try {
94
+ switch ($ handler ) {
95
+ case static ::HANDLER_FILE :
96
+ $ handlerInstance = new StreamHandler (
97
+ $ configuration ->get ('file ' ),
98
+ $ minLevel ?: Logger::DEBUG
99
+ );
100
+ break ;
101
+ case static ::HANDLER_FILE_ERROR :
102
+ $ handlerInstance = new StreamHandler (
103
+ $ configuration ->get ('file ' ),
104
+ $ minLevel ?: Logger::WARNING
105
+ );
106
+ break ;
107
+ case static ::HANDLER_STREAM :
108
+ $ defaultLevelStream = !empty ($ levelOverride ) ?
109
+ $ this ->normalizeLevel ($ levelOverride )
110
+ : Logger::INFO ;
111
+ $ handlerInstance = new StreamHandler (
112
+ $ configuration ->get ('stream ' ),
113
+ $ minLevel ?: $ defaultLevelStream
114
+ );
115
+ break ;
116
+ case static ::HANDLER_EMAIL :
117
+ $ handlerInstance = new NativeMailerHandler (
118
+ $ configuration ->get ('to ' ),
119
+ $ configuration ->get ('subject ' , 'Log from Magento Cloud ' ),
120
+ $ configuration ->get ('from ' ),
121
+ $ minLevel ?: Logger::NOTICE
122
+ );
123
+ break ;
124
+ case static ::HANDLER_SLACK :
125
+ $ handlerInstance = new SlackHandler (
126
+ $ configuration ->get ('token ' ),
127
+ $ configuration ->get ('channel ' , 'general ' ),
128
+ $ configuration ->get ('username ' , 'Slack Log Notifier ' ),
129
+ true ,
130
+ null ,
131
+ $ minLevel ?: Logger::NOTICE
132
+ );
133
+ break ;
134
+ case static ::HANDLER_SYSLOG :
135
+ $ handlerInstance = new SyslogHandler (
136
+ $ configuration ->get ('ident ' ),
137
+ $ configuration ->get ('facility ' , LOG_USER ),
138
+ $ minLevel ?: Logger::NOTICE ,
139
+ true ,
140
+ $ configuration ->get ('logopts ' , LOG_PID )
141
+ );
142
+ break ;
143
+ case static ::HANDLER_SYSLOG_UDP :
144
+ $ handlerInstance = new SyslogUdpHandler (
145
+ $ configuration ->get ('host ' ),
146
+ $ configuration ->get ('port ' ),
147
+ $ configuration ->get ('facility ' , LOG_USER ),
148
+ $ minLevel ?: Logger::NOTICE ,
149
+ true ,
150
+ $ configuration ->get ('ident ' , 'php ' )
151
+ );
152
+ break ;
153
+ case static ::HANDLER_GELF :
154
+ $ handlerInstance = $ this ->gelfHandlerFactory ->create ($ configuration , $ minLevel );
155
+ break ;
156
+ default :
157
+ throw new LoggerException ('Unknown type of log handler: ' . $ handler );
158
+ }
159
+ } catch (\Exception $ exception ) {
160
+ throw new LoggerException ($ exception ->getMessage (), $ exception ->getCode (), $ exception );
147
161
}
148
162
149
163
return $ handlerInstance ;
150
164
}
165
+
166
+ /**
167
+ * @param string $level
168
+ * @return int
169
+ * @throws LoggerException
170
+ */
171
+ private function normalizeLevel (string $ level ): int
172
+ {
173
+ /** @phpstan-ignore-next-line */
174
+ $ normalizedLevel = Logger::toMonologLevel ($ level );
175
+
176
+ if (!is_int ($ normalizedLevel )) {
177
+ throw new LoggerException ('Logger lever is incorrect ' );
178
+ }
179
+
180
+ return $ normalizedLevel ;
181
+ }
151
182
}
0 commit comments