Skip to content

Commit 3006a6d

Browse files
committed
work
1 parent ccb3215 commit 3006a6d

File tree

2 files changed

+3
-336
lines changed

2 files changed

+3
-336
lines changed

LOGGING.md

Lines changed: 1 addition & 303 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ Maho supports 8 log levels (from highest to lowest priority):
5050
| `Mage::LOG_ERR` | `Mage::LOG_ERROR` |
5151
| `Mage::LOG_WARN` | `Mage::LOG_WARNING` |
5252

53-
**Note:** Maho constants now use Monolog Level enums instead of integers for better type safety. Legacy integer values (0-7) are still supported for backwards compatibility. All logs are created with channel name "Maho" for proper branding in browser console output.
53+
**Note:** Maho constants now use Monolog Level enums instead of integers for better type safety. Legacy integer values (0-7) are still supported for backwards compatibility. All logs are created with channel name "Maho".
5454

5555
### Simple Logging
5656

@@ -195,9 +195,6 @@ These handlers work out-of-the-box with XML configuration because they only requ
195195
- `TelegramBotHandler` - Telegram notifications
196196
- `NativeMailerHandler` - Email via PHP mail()
197197

198-
**Development Handlers:**
199-
- `BrowserConsoleHandler` - Browser console output
200-
201198
### File Handlers
202199

203200
#### RotatingFileHandler (Default)
@@ -329,305 +326,6 @@ Sends logs via email.
329326
</email>
330327
```
331328

332-
### Development Handlers
333-
334-
#### BrowserConsoleHandler
335-
Outputs logs to browser console (useful for development).
336-
337-
```xml
338-
<!-- Simple: All log levels -->
339-
<browser>
340-
<class>Monolog\Handler\BrowserConsoleHandler</class>
341-
</browser>
342-
343-
<!-- Custom: Specific level -->
344-
<browser>
345-
<class>Monolog\Handler\BrowserConsoleHandler</class>
346-
<params>
347-
<level>ERROR</level>
348-
</params>
349-
</browser>
350-
```
351-
352-
### **Unsupported Handlers (Manual Setup Required)**
353-
354-
These handlers require complex object dependencies (not primitive parameters) and cannot be configured via XML:
355-
356-
- **RedisHandler** - Requires Redis client object (`Predis\Client` or `Redis`)
357-
- **SymfonyMailerHandler** - Requires Mailer and Email objects
358-
- **MongoDBHandler** - Requires MongoDB client object
359-
- **ElasticsearchHandler** - Requires Elasticsearch client object
360-
- **AmqpHandler** - Requires AMQP connection object
361-
- **RabbitMqHandler** - Requires RabbitMQ connection object
362-
363-
For these handlers, configure them manually in custom code. For email logging, use **NativeMailerHandler** instead (XML-configurable).
364-
365-
## Multiple Handler Support
366-
367-
Maho supports multiple handlers simultaneously. Each handler processes logs **at or above** its configured level, creating a cascading alert system.
368-
369-
### Basic Multi-Handler Example
370-
371-
```xml
372-
<log>
373-
<handlers>
374-
<!-- File logging for all levels -->
375-
<file>
376-
<class>Monolog\Handler\RotatingFileHandler</class>
377-
<params>
378-
<level>DEBUG</level>
379-
<maxFiles>14</maxFiles>
380-
</params>
381-
</file>
382-
383-
<!-- Slack alerts for errors -->
384-
<slack>
385-
<class>Monolog\Handler\SlackWebhookHandler</class>
386-
<params>
387-
<level>ERROR</level>
388-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
389-
<channel>#alerts</channel>
390-
</params>
391-
</slack>
392-
393-
<!-- Email for critical issues -->
394-
<email>
395-
<class>Monolog\Handler\NativeMailerHandler</class>
396-
<params>
397-
<level>CRITICAL</level>
398-
<to>admin@example.com</to>
399-
<subject>CRITICAL: Maho System Alert</subject>
400-
</params>
401-
</email>
402-
</handlers>
403-
</log>
404-
```
405-
406-
## Advanced Examples
407-
408-
### Multi-Handler Setup
409-
410-
```xml
411-
<log>
412-
<handlers>
413-
<!-- Rotating file logging for all levels -->
414-
<file>
415-
<class>Monolog\Handler\RotatingFileHandler</class>
416-
417-
<params>
418-
<level>DEBUG</level>
419-
<maxFiles>14</maxFiles>
420-
</params>
421-
</file>
422-
423-
<!-- Slack for errors -->
424-
<slack>
425-
<class>Monolog\Handler\SlackWebhookHandler</class>
426-
427-
<params>
428-
<level>ERROR</level>
429-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
430-
<channel>#alerts</channel>
431-
</params>
432-
</slack>
433-
434-
<!-- Email for critical issues -->
435-
<email>
436-
<class>Monolog\Handler\NativeMailerHandler</class>
437-
438-
<params>
439-
<level>CRITICAL</level>
440-
<to>admin@example.com</to>
441-
<subject>CRITICAL: Maho System Alert</subject>
442-
</params>
443-
</email>
444-
</handlers>
445-
</log>
446-
```
447-
448-
### Multiple Handlers of Same Type
449-
450-
You can configure multiple handlers of the same type for different purposes. For example, multiple Slack handlers for different alert levels:
451-
452-
```xml
453-
<log>
454-
<handlers>
455-
<!-- Rotating file logging for all levels -->
456-
<file>
457-
<class>Monolog\Handler\RotatingFileHandler</class>
458-
459-
<params>
460-
<level>DEBUG</level>
461-
<maxFiles>14</maxFiles>
462-
</params>
463-
</file>
464-
465-
<!-- Slack for general errors - #alerts channel -->
466-
<slack_errors>
467-
<class>Monolog\Handler\SlackWebhookHandler</class>
468-
469-
<params>
470-
<level>ERROR</level>
471-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
472-
<channel>#alerts</channel>
473-
<username>Maho-Errors</username>
474-
<iconEmoji>:warning:</iconEmoji>
475-
</params>
476-
</slack_errors>
477-
478-
<!-- Slack for critical issues - #critical channel -->
479-
<slack_critical>
480-
<class>Monolog\Handler\SlackWebhookHandler</class>
481-
482-
<params>
483-
<level>CRITICAL</level>
484-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
485-
<channel>#critical</channel>
486-
<username>Maho-Critical</username>
487-
<iconEmoji>:fire:</iconEmoji>
488-
</params>
489-
</slack_critical>
490-
491-
<!-- Slack for warnings - #warnings channel -->
492-
<slack_warnings>
493-
<class>Monolog\Handler\SlackWebhookHandler</class>
494-
495-
<params>
496-
<level>WARNING</level>
497-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
498-
<channel>#warnings</channel>
499-
<username>Maho-Warnings</username>
500-
<iconEmoji>:yellow_circle:</iconEmoji>
501-
</params>
502-
</slack_warnings>
503-
</handlers>
504-
</log>
505-
```
506-
507-
**How level filtering works:**
508-
- `WARNING` level logs go to: file + #warnings + #alerts + #critical
509-
- `ERROR` level logs go to: file + #alerts + #critical
510-
- `CRITICAL` level logs go to: file + #critical only
511-
- `INFO` level logs go to: file only
512-
513-
### Specialized Alert Channels
514-
515-
You can also set up handlers for different types of alerts:
516-
517-
```xml
518-
<handlers>
519-
<!-- Default file logging -->
520-
<file>
521-
<class>Monolog\Handler\StreamHandler</class>
522-
523-
<params>
524-
<level>DEBUG</level>
525-
</params>
526-
</file>
527-
528-
<!-- Payment issues - dedicated channel -->
529-
<slack_payments>
530-
<class>Monolog\Handler\SlackWebhookHandler</class>
531-
532-
<params>
533-
<level>ERROR</level>
534-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
535-
<channel>#payments</channel>
536-
<username>Maho-Payments</username>
537-
<iconEmoji>:credit_card:</iconEmoji>
538-
</params>
539-
</slack_payments>
540-
541-
<!-- Security issues - high priority channel -->
542-
<slack_security>
543-
<class>Monolog\Handler\SlackWebhookHandler</class>
544-
545-
<params>
546-
<level>WARNING</level>
547-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
548-
<channel>#security</channel>
549-
<username>Maho-Security</username>
550-
<iconEmoji>:shield:</iconEmoji>
551-
</params>
552-
</slack_security>
553-
554-
<!-- Emergency alerts -->
555-
<slack_emergency>
556-
<class>Monolog\Handler\SlackWebhookHandler</class>
557-
558-
<params>
559-
<level>EMERGENCY</level>
560-
<webhookUrl>https://hooks.slack.com/services/YOUR/WEBHOOK/URL</webhookUrl>
561-
<channel>#emergency</channel>
562-
<username>Maho-EMERGENCY</username>
563-
<iconEmoji>:rotating_light:</iconEmoji>
564-
</params>
565-
</slack_emergency>
566-
</handlers>
567-
```
568-
569-
### Custom Handler
570-
571-
You can use any Monolog handler by specifying its full class name:
572-
573-
```xml
574-
<custom>
575-
<class>Your\Custom\MonologHandler</class>
576-
577-
<params>
578-
<level>INFO</level>
579-
<customParam>value</customParam>
580-
<numericParam>123</numericParam>
581-
<boolParam>true</boolParam>
582-
</params>
583-
</custom>
584-
```
585-
586-
### Environment-Specific Configuration
587-
588-
```xml
589-
<!-- Production: Rotating file + Slack for errors -->
590-
<handlers>
591-
<file>
592-
<class>Monolog\Handler\RotatingFileHandler</class>
593-
594-
<params>
595-
<level>WARNING</level>
596-
<maxFiles>14</maxFiles>
597-
</params>
598-
</file>
599-
<slack>
600-
<class>Monolog\Handler\SlackWebhookHandler</class>
601-
602-
<params>
603-
<level>ERROR</level>
604-
<webhookUrl>https://hooks.slack.com/services/PROD/WEBHOOK/URL</webhookUrl>
605-
</params>
606-
</slack>
607-
</handlers>
608-
```
609-
610-
```xml
611-
<!-- Development: Rotating file + Browser console -->
612-
<handlers>
613-
<file>
614-
<class>Monolog\Handler\RotatingFileHandler</class>
615-
616-
<params>
617-
<level>DEBUG</level>
618-
<maxFiles>7</maxFiles>
619-
</params>
620-
</file>
621-
<browser>
622-
<class>Monolog\Handler\BrowserConsoleHandler</class>
623-
624-
<params>
625-
<level>DEBUG</level>
626-
</params>
627-
</browser>
628-
</handlers>
629-
```
630-
631329
### Complex Handler Configurations
632330

633331
#### Syslog with Custom Facility and Ident

app/code/core/Mage/Log/Helper/Data.php

Lines changed: 2 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,6 @@ public function log(mixed $message, Level|int|null $level = null, string $file =
133133
// Convert log level and log the message
134134
$monologLevel = self::convertLogLevel($level);
135135
self::$_loggers[$file]->log($monologLevel, $message);
136-
137-
// Auto-flush BrowserConsoleHandler for immediate output
138-
$this->flushBrowserConsoleHandlers($file);
139136
}
140137

141138
protected function createLogger(string $file, Level|int $maxLogLevel, bool $forceLog): void
@@ -223,12 +220,6 @@ protected static function createMonologHandler(string $name, object $config, str
223220
);
224221
}
225222

226-
// Skip BrowserConsoleHandler for CLI commands
227-
if ($className === \Monolog\Handler\BrowserConsoleHandler::class && php_sapi_name() === 'cli') {
228-
// Return a NullHandler instead to avoid any output
229-
return new \Monolog\Handler\NullHandler();
230-
}
231-
232223
try {
233224
$reflection = new ReflectionClass($className);
234225

@@ -242,9 +233,8 @@ protected static function createMonologHandler(string $name, object $config, str
242233
/** @var \Monolog\Handler\HandlerInterface $handler */
243234
$handler = $reflection->newInstanceArgs($args);
244235

245-
// Apply custom formatter only to file-based handlers (not browser console)
246-
if (method_exists($handler, 'setFormatter') &&
247-
!($handler instanceof \Monolog\Handler\BrowserConsoleHandler)) {
236+
// Apply custom formatter to all handlers that support it
237+
if (method_exists($handler, 'setFormatter')) {
248238
$handler->setFormatter(self::createMonologFormatter());
249239
}
250240

@@ -370,27 +360,6 @@ protected static function createDefaultMonologHandler(string $logFile, Level $de
370360
return $handler;
371361
}
372362

373-
/**
374-
* Flush BrowserConsoleHandler to ensure immediate output
375-
*/
376-
protected function flushBrowserConsoleHandlers(string $file): void
377-
{
378-
// Skip browser console operations in CLI
379-
if (php_sapi_name() === 'cli') {
380-
return;
381-
}
382-
383-
if (!isset(self::$_loggers[$file])) {
384-
return;
385-
}
386-
387-
foreach (self::$_loggers[$file]->getHandlers() as $handler) {
388-
if ($handler instanceof \Monolog\Handler\BrowserConsoleHandler) {
389-
$handler->send();
390-
}
391-
}
392-
}
393-
394363
/**
395364
* Check if logger has a RotatingFileHandler
396365
*/

0 commit comments

Comments
 (0)