PHPackages                             dennisvanbeersel/symfony-logger-client - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Logging &amp; Monitoring](/categories/logging)
4. /
5. dennisvanbeersel/symfony-logger-client

ActiveSymfony-bundle[Logging &amp; Monitoring](/categories/logging)

dennisvanbeersel/symfony-logger-client
======================================

Symfony bundle for Application Logger error tracking platform

v0.2.2(4mo ago)00MITJavaScriptPHP &gt;=8.2CI failing

Since Oct 27Pushed 4mo agoCompare

[ Source](https://github.com/dennisvanbeersel/symfony-logger-client)[ Packagist](https://packagist.org/packages/dennisvanbeersel/symfony-logger-client)[ RSS](/packages/dennisvanbeersel-symfony-logger-client/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (5)Dependencies (13)Versions (6)Used By (0)

AppLogger - Symfony Bundle
==========================

[](#applogger---symfony-bundle)

**🛡️ Privacy-First Error Tracking for Symfony - Hosted in EU**

[![PHP](https://camo.githubusercontent.com/0137db7634f2bfb58931a1788223a4a9136100008a2ee84e758b20b9c6ec21a0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253545382e322d626c75653f7374796c653d666c61742d737175617265)](https://www.php.net/)[![Symfony](https://camo.githubusercontent.com/d3c05602f5e16397e81b17b1cf19dbad13aa4dc6e804827d6d83424310e1c237/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73796d666f6e792d362e34253230253743253230372e782d677265656e3f7374796c653d666c61742d737175617265)](https://symfony.com/)[![License](https://camo.githubusercontent.com/942e017bf0672002dd32a857c95d66f28c5900ab541838c6c664442516309c8a/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d626c75652e7376673f7374796c653d666c61742d737175617265)](https://github.com/dennisvanbeersel/application-logger/blob/master/LICENSE)[![Tests](https://camo.githubusercontent.com/a0b8d0c6e3c9b6c7eb5c5d6f213808c94a42c38d33d8291d2e7e7890aaada0c3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f74657374732d70617373696e672d737563636573733f7374796c653d666c61742d737175617265)](https://github.com/dennisvanbeersel/symfony-logger-client)[![PHPStan](https://camo.githubusercontent.com/73449e417e547f7a6bb5d85a5d4a0ff346663a4e8f79810c9ba19360edeb8df3/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048505374616e2d6c6576656c253230362d737563636573733f7374796c653d666c61742d737175617265)](https://github.com/dennisvanbeersel/symfony-logger-client)

*Resilience-first error tracking with integrated JavaScript SDK - your app never slows down* ⚡

[Quick Start](#-quick-start) • [Why This Bundle?](#-why-this-bundle) • [Features](#-features) • [Documentation](#-documentation)

---

📦 TL;DR - Get Started in 2 Minutes
----------------------------------

[](#-tldr---get-started-in-2-minutes)

```
# 1. Install
composer require dennisvanbeersel/symfony-logger-client

# 2. Configure (config/packages/application_logger.yaml)
application_logger:
    dsn: '%env(APPLICATION_LOGGER_DSN)%'
    api_key: '%env(APPLICATION_LOGGER_API_KEY)%'

# 3. Add credentials to .env
APPLICATION_LOGGER_DSN=https://applogger.eu/your-project-uuid
APPLICATION_LOGGER_API_KEY=your-64-character-api-key-here

# 4. Clear cache
php bin/console cache:clear
```

**Done!** All PHP exceptions and JavaScript errors are now automatically tracked. No code changes needed.

---

🎯 Why This Bundle?
------------------

[](#-why-this-bundle)

**AppLogger** ([applogger.eu](https://applogger.eu)) is an EU-hosted, privacy-first error tracking SaaS platform specifically designed for Symfony applications. This bundle provides zero-config integration with production-grade resilience.

Most error tracking solutions have a **critical flaw**: they can slow down or even crash your application when the tracking service is down. This bundle is different.

### Core Philosophy: **Never Impact Your Application**

[](#core-philosophy-never-impact-your-application)

We achieve this through battle-tested resilience patterns:

FeatureThis BundleTypical SolutionsImpact**Timeout**⚡ 2s max (configurable)⏰ Often 30s+ or none**50ms vs 30s+ delay****Circuit Breaker**✅ Automatic failover❌ Keep retrying**Stops wasting resources****Fire &amp; Forget**✅ Returns instantly❌ Waits for response**&lt;1ms vs 2000ms****Exception Safety**✅ Never throws⚠️ Can crash app**100% uptime guarantee****JS Offline Queue**✅ localStorage backup❌ Errors lost**Zero data loss****JS Rate Limiting**✅ Token bucket❌ Can overwhelm API**Protected from error storms**### Real-World Impact

[](#real-world-impact)

**Without resilience patterns:**

```
// API is down, timeout is 30s
$start = microtime(true);
errorTracker()->captureException($e);  // Blocks for 30 seconds!
$elapsed = microtime(true) - $start;   // 30,000ms
// User waited 30 seconds for page to load 😱
```

**With this bundle:**

```
// API is down, circuit breaker is open
$start = microtime(true);
errorTracker()->captureException($e);  // Returns instantly
$elapsed = microtime(true) - $start;   //  ['all' => true],
];
```

### Configuration

[](#configuration)

#### Minimal Configuration (Recommended)

[](#minimal-configuration-recommended)

```
# config/packages/application_logger.yaml
application_logger:
    dsn: '%env(APPLICATION_LOGGER_DSN)%'
```

Add to `.env`:

```
APPLICATION_LOGGER_DSN=https://public_key@logger.example.com/project_id
APP_VERSION=1.0.0  # Optional but recommended
```

#### Full Configuration Example

[](#full-configuration-example)

**Click to see all available options**```
# config/packages/application_logger.yaml
application_logger:
    # Required: Your AppLogger DSN (get from applogger.eu dashboard)
    dsn: '%env(APPLICATION_LOGGER_DSN)%'

    # Optional: Enable/disable the bundle
    enabled: true

    # Optional: Application version for release tracking
    release: '%env(APP_VERSION)%'

    # Optional: Environment identifier
    environment: '%kernel.environment%'

    # Resilience Settings
    timeout: 2.0              # API timeout (0.5-5.0 seconds)
    retry_attempts: 0         # Retry failed requests (0-3, 0=fail fast)
    async: true               # Fire-and-forget mode (recommended)

    # Circuit Breaker
    circuit_breaker:
        enabled: true         # Enable circuit breaker pattern
        failure_threshold: 5  # Open after N consecutive failures
        timeout: 60           # Stay open for N seconds
        half_open_attempts: 1 # Test requests before closing

    # What to Capture
    capture_level: error      # Monolog level: debug, info, warning, error, critical

    # Breadcrumbs
    max_breadcrumbs: 50       # Maximum breadcrumbs to keep (10-100)

    # Security: Sensitive Data Scrubbing
    scrub_fields:
        - password
        - token
        - api_key
        - secret
        - authorization
        - credit_card
        - ssn

    # Session Tracking (Required for session replay)
    session_tracking:
        enabled: true              # Enable automatic session tracking (default: true)
        track_page_views: true     # Track page views as session events (default: true)
        idle_timeout: 1800         # Session idle timeout in seconds (default: 30 min)

    # Error-Triggered Session Replay
    session_replay:
        enabled: true                      # Enable session replay (default: true)
        buffer_before_error_seconds: 30    # Seconds to buffer before error (5-60, default: 30)
        buffer_before_error_clicks: 10     # Clicks to buffer before error (1-15, default: 10)
        buffer_after_error_seconds: 30     # Seconds to buffer after error (5-60, default: 30)
        buffer_after_error_clicks: 10      # Clicks to buffer after error (1-15, default: 10)
        click_debounce_ms: 1000            # Click debounce delay (100-5000ms, default: 1000)
        snapshot_throttle_ms: 1000         # DOM snapshot throttle (500-5000ms, default: 1000)
        max_snapshot_size: 1048576         # Max snapshot size in bytes (default: 1MB)
        session_timeout_minutes: 30        # Cross-page session timeout (5-120 min, default: 30)
        max_buffer_size_mb: 5              # Max localStorage size (1-20MB, default: 5MB)
        expose_api: true                   # Expose JS API for user control (default: true)

    # JavaScript SDK
    javascript:
        enabled: true         # Enable Twig globals for JS SDK
        auto_inject: true     # Auto-inject init script (recommended)
        debug: false          # Enable console.log debugging

    # Debug
    debug: '%kernel.debug%'   # Enable internal logging
```

### Clear Cache

[](#clear-cache)

```
php bin/console cache:clear
```

**Done!** All exceptions are now automatically tracked. Visit your AppLogger dashboard at [applogger.eu](https://applogger.eu) to see errors.

---

📖 Usage
-------

[](#-usage)

### 1️⃣ PHP Backend Usage

[](#1️⃣-php-backend-usage)

#### Automatic Capture (Zero Code Changes)

[](#automatic-capture-zero-code-changes)

The bundle automatically captures:

- ✅ **Uncaught exceptions** via Symfony event subscriber
- ✅ **HTTP status codes** (404, 403, 500, etc.)
- ✅ **Monolog error logs** (when configured)
- ✅ **User context** from Symfony Security
- ✅ **Request data** (headers, POST data, query params)

**No code changes required!** Just install and configure.

#### Monolog Integration

[](#monolog-integration)

Send error-level logs to AppLogger:

```
# config/packages/monolog.yaml
monolog:
    handlers:
        application_logger:
            type: service
            id: ApplicationLogger\Bundle\Monolog\Handler\ApplicationLoggerHandler
            level: error
            channels: ['!event']  # Exclude to avoid duplication
```

Now all `$logger->error()`, `$logger->critical()`, etc. calls are tracked.

#### Manual Error Capture

[](#manual-error-capture)

For custom error handling:

```
use ApplicationLogger\Bundle\Service\ApiClient;
use ApplicationLogger\Bundle\Service\BreadcrumbCollector;

class PaymentService
{
    public function __construct(
        private ApiClient $apiClient,
        private BreadcrumbCollector $breadcrumbs
    ) {}

    public function processPayment(Order $order): void
    {
        // Add breadcrumb for context
        $this->breadcrumbs->add([
            'type' => 'user',
            'category' => 'payment',
            'message' => 'Processing payment',
            'data' => ['order_id' => $order->getId()],
        ]);

        try {
            $this->chargeCustomer($order);
        } catch (\Exception $e) {
            // Manual error reporting
            $this->apiClient->sendError([
                'exception' => [
                    'type' => $e::class,
                    'value' => $e->getMessage(),
                    'stacktrace' => $this->formatStackTrace($e),
                ],
                'level' => 'error',
                'tags' => ['feature' => 'payment'],
            ]);

            throw $e; // Re-throw if needed
        }
    }
}
```

#### Adding Breadcrumbs

[](#adding-breadcrumbs)

Track user actions leading up to errors:

```
use ApplicationLogger\Bundle\Service\BreadcrumbCollector;

class CheckoutController extends AbstractController
{
    public function __construct(
        private BreadcrumbCollector $breadcrumbs
    ) {}

    #[Route('/checkout/step-1')]
    public function step1(): Response
    {
        $this->breadcrumbs->add([
            'type' => 'navigation',
            'category' => 'checkout',
            'message' => 'User entered checkout',
            'level' => 'info',
        ]);

        // ... your code
    }
}
```

### 2️⃣ JavaScript SDK Usage

[](#2️⃣-javascript-sdk-usage)

#### Zero-Config Mode (Automatic) ⭐ Recommended

[](#zero-config-mode-automatic--recommended)

**Default behavior - no setup needed!**

The bundle automatically:

1. ✅ Registers JS SDK with AssetMapper
2. ✅ Injects initialization script on all HTML pages
3. ✅ Configures with your DSN
4. ✅ Sets environment and release
5. ✅ Populates user context
6. ✅ Makes `window.appLogger` available

**Just install the bundle - JavaScript tracking works immediately!**

#### Manual Mode (Custom Control)

[](#manual-mode-custom-control)

If you want control over when/where the SDK loads:

```
# config/packages/application_logger.yaml
application_logger:
    javascript:
        auto_inject: false  # Disable automatic injection
```

Then manually add to your templates:

```
{# templates/base.html.twig #}

    {% block body %}{% endblock %}

    {# Manually place the initialization script #}
    {{ application_logger_init() }}

```

#### Using the JavaScript SDK

[](#using-the-javascript-sdk)

Once loaded, use `window.appLogger`:

```
// Capture exceptions
try {
    riskyOperation();
} catch (error) {
    window.appLogger.captureException(error, {
        tags: { component: 'checkout' },
        extra: { orderId: 12345 }
    });
}

// Capture messages
window.appLogger.captureMessage('Payment processed', 'info');

// Add breadcrumbs
window.appLogger.addBreadcrumb({
    type: 'user',
    message: 'User clicked checkout button',
    data: { cartTotal: 99.99 }
});

// Set user context
window.appLogger.setUser({
    id: 'user-123',
    email: 'user@example.com'
});

// Check circuit breaker status
window.appLogger.transport.getStats();
// {queueSize: 0, rateLimitTokens: 9.2, circuitBreaker: {state: 'closed'}}
```

---

🛡️ Resilience Features Explained
--------------------------------

[](#️-resilience-features-explained)

### Circuit Breaker Pattern

[](#circuit-breaker-pattern)

**Problem:** When the API is down, your app wastes resources retrying.

**Solution:** Circuit breaker with three states:

```
CLOSED (normal) → [5 failures] → OPEN (service down)
                                      ↓
                               [60 seconds wait]
                                      ↓
CLOSED ← [success] ← HALF_OPEN ← [timeout passed]
         [failure] → OPEN

```

**PHP Implementation:**

- Uses Symfony Cache for state persistence
- After 5 consecutive failures → opens for 60 seconds
- While OPEN: all API calls skip immediately (zero overhead)
- After 60s: enters HALF\_OPEN, tries 1 request
- Success → CLOSED, failure → OPEN for another 60s

**JavaScript Implementation:**

- Uses sessionStorage for state persistence
- Same 3-state logic as PHP
- Prevents browser from hitting failing API

**Monitoring:**

```
// PHP
$state = $apiClient->getCircuitBreakerState();
// ['state' => 'closed', 'failureCount' => 2, 'openedAt' => null]
```

```
// JavaScript
window.appLogger.transport.circuitBreaker.getState();
// {state: 'closed', failureCount: 0, openedAt: null}
```

### Timeout Protection

[](#timeout-protection)

**PHP:**

- Maximum 2 seconds per API call (configurable 0.5-5s)
- Configured at HTTP client level
- After timeout: connection aborted, circuit breaker records failure

**JavaScript:**

- Maximum 3 seconds per API call
- Uses `AbortController` to forcefully abort
- After timeout: error queued to localStorage

### Fire-and-Forget Mode (PHP)

[](#fire-and-forget-mode-php)

When `async: true` (default):

```
// With async: false (synchronous)
$start = microtime(true);
$apiClient->sendError($payload);
$elapsed = microtime(true) - $start;
// $elapsed could be 2000ms (full timeout)

// With async: true (fire-and-forget)
$start = microtime(true);
$apiClient->sendError($payload);
$elapsed = microtime(true) - $start;
// $elapsed is typically < 1ms (request queued, method returns)
```

### Offline Queue (JavaScript)

[](#offline-queue-javascript)

When API is unreachable:

1. Errors stored in localStorage (FIFO queue)
2. Maximum 50 errors (oldest removed first)
3. Errors expire after 24 hours
4. On next successful connection: queue automatically flushed

**Handles quota errors gracefully:**

- If localStorage full → removes oldest 50%
- If still full → clears entire queue

### Rate Limiting (JavaScript)

[](#rate-limiting-javascript)

Token bucket algorithm prevents error storms:

- **Capacity:** 10 tokens
- **Refill rate:** ~1 token per 6 seconds (~10 per minute)
- **Behavior:** No tokens → error goes to offline queue

```
window.appLogger.transport.getStats();
// {rateLimitTokens: 8.5, queueSize: 0, ...}
```

### Deduplication (JavaScript)

[](#deduplication-javascript)

Prevents sending the same error repeatedly:

- Creates hash from: error type + message + top 3 stack frames
- Remembers recently sent errors for 5 seconds
- Duplicate detected → ignored

### Beacon API (JavaScript)

[](#beacon-api-javascript)

**Problem:** When user closes tab, errors in queue are lost.

**Solution:** `navigator.sendBeacon()` API

- Listens to `beforeunload` and `visibilitychange`
- Flushes up to 10 most recent errors
- Guaranteed delivery even as page closes

---

🔒 Security Features
-------------------

[](#-security-features)

### Automatic Data Scrubbing

[](#automatic-data-scrubbing)

Sensitive data automatically removed from error reports:

**Default scrubbed fields:**

- password, passwd, pwd
- token, api\_key, secret
- authorization, auth
- credit\_card, ssn, private\_key

**How it works:**

- Recursive key check (case-insensitive substring matching)
- Replaces values with `[REDACTED]`
- Applies to: request data, headers, cookies, extra context

**Example:**

```
$request->request->all();
// ['email' => 'user@example.com', 'password' => 'secret123']

// Sent to API as:
// ['email' => 'user@example.com', 'password' => '[REDACTED]']
```

**Custom scrub fields:**

```
application_logger:
    scrub_fields:
        - password
        - credit_card
        - my_custom_secret
```

### IP Address Anonymization

[](#ip-address-anonymization)

**IPv4:** Masks last octet

```
192.168.1.100 → 192.168.1.0

```

**IPv6:** Masks last 80 bits

```
2001:0db8:85a3:0000:0000:8a2e:0370:7334
→ 2001:0db8:85a3:0000:0000:0000:0000:0000

```

**Why:** GDPR compliance - IP addresses are personal data.

---

🔧 Advanced Configuration
------------------------

[](#-advanced-configuration)

### Disable in Development

[](#disable-in-development)

```
# config/packages/dev/application_logger.yaml
application_logger:
    enabled: false
```

Or use `.env.local`:

```
APPLICATION_LOGGER_ENABLED=false
```

### Multiple Projects

[](#multiple-projects)

Send errors to different AppLogger projects:

```
# config/services.yaml
services:
    app.logger.project_a:
        class: ApplicationLogger\Bundle\Service\ApiClient
        arguments:
            $dsn: '%env(LOGGER_DSN_PROJECT_A)%'
            $timeout: 2.0
            $circuitBreaker: '@ApplicationLogger\Bundle\Service\CircuitBreaker'

    app.logger.project_b:
        class: ApplicationLogger\Bundle\Service\ApiClient
        arguments:
            $dsn: '%env(LOGGER_DSN_PROJECT_B)%'
            $timeout: 2.0
            $circuitBreaker: '@ApplicationLogger\Bundle\Service\CircuitBreaker'
```

### Custom Error Handler

[](#custom-error-handler)

```
use ApplicationLogger\Bundle\Service\ApiClient;
use ApplicationLogger\Bundle\Service\BreadcrumbCollector;
use ApplicationLogger\Bundle\Service\ContextCollector;

class CustomErrorHandler
{
    public function __construct(
        private ApiClient $apiClient,
        private ContextCollector $contextCollector,
        private BreadcrumbCollector $breadcrumbs
    ) {}

    public function handleBusinessError(BusinessException $e): void
    {
        $this->apiClient->sendError([
            'exception' => [
                'type' => $e::class,
                'value' => $e->getMessage(),
                'stacktrace' => $this->formatTrace($e),
            ],
            'level' => 'warning', // Business errors are warnings
            'context' => $this->contextCollector->collectContext(),
            'breadcrumbs' => $this->breadcrumbs->get(),
            'tags' => [
                'error_type' => 'business',
                'rule' => $e->getBusinessRule(),
            ],
        ]);
    }
}
```

---

🐛 Troubleshooting
-----------------

[](#-troubleshooting)

**Errors Not Appearing in Dashboard****1. Check bundle is enabled:**

```
php bin/console debug:config application_logger
```

**2. Check DSN is correct:**

```
php bin/console debug:container --parameters | grep application_logger.dsn
```

**3. Check circuit breaker:**

```
$cbState = $this->apiClient->getCircuitBreakerState();
// If state is 'open', wait 60s or clear cache
```

**4. Enable debug mode:**

```
application_logger:
    debug: true
```

Check `var/log/dev.log` for details.

**Circuit Breaker Stuck Open****Solution 1:** Wait for timeout (default 60 seconds)

**Solution 2:** Clear cache:

```
php bin/console cache:clear
```

**Solution 3:** Manually reset:

```
$cache->delete('app_logger_circuit_breaker_state');
```

**JavaScript SDK Not Loading****1. Check AssetMapper:**

```
php bin/console debug:asset-map | grep application-logger
```

**2. Check browser console** for import errors

**3. Verify meta tag exists:**

```

```

**DSN Format Error****Correct format:**

```
https://public_key@your-host.com/project_id

```

**Common mistakes:**

```
❌ http://public_key@host/project       (use https://)
❌ https://host/project                 (missing public_key@)
❌ https://public_key:secret@host/proj  (secret not needed)
❌ https://public_key@host              (missing /project_id)

```

---

🛠️ Development
--------------

[](#️-development)

### Code Quality

[](#code-quality)

```
composer lint        # PHP-CS-Fixer + PHPStan
composer cs-check    # Check PSR-12
composer cs-fix      # Auto-fix PSR-12
composer phpstan     # Static analysis (level 6)
npm run lint         # ESLint
npm run lint:fix     # Auto-fix ESLint
```

### Testing

[](#testing)

```
# PHP tests
composer test
vendor/bin/phpunit

# JavaScript tests
npm test
npm run test:coverage
```

### Requirements

[](#requirements)

**Minimum:**

- PHP 8.2+
- Symfony 6.4 or 7.x
- ext-json, ext-curl

**Recommended:**

- PHP 8.3+
- Symfony 7.1+
- APCu or Redis (production cache)

---

📚 Documentation
---------------

[](#-documentation)

DocumentDescription[AppLogger Website](https://applogger.eu)Sign up and get your DSN[API Reference](https://github.com/dennisvanbeersel/application-logger/blob/master/docs/API.md)REST API documentation[Architecture](https://github.com/dennisvanbeersel/application-logger/blob/master/docs/ARCHITECTURE.md)Technical architecture[Security &amp; Testing](https://github.com/dennisvanbeersel/application-logger/blob/master/docs/SECURITY_AND_TESTING.md)Security practices and testing guidelines---

📝 License
---------

[](#-license)

Part of the AppLogger project - see main [LICENSE](https://github.com/dennisvanbeersel/application-logger/blob/master/LICENSE) file.

---

🙏 Credits
---------

[](#-credits)

**Key Design Principles:**

1. **Resilience first** - never impact the host application
2. **Secure by default** - no sensitive data exposure
3. **Zero configuration** - works out of the box
4. **Production ready** - battle-tested patterns
5. **Developer friendly** - comprehensive docs

Built with ❤️ for the Symfony community.

---

**Questions? Issues? Feedback?**

[📖 Documentation](https://github.com/dennisvanbeersel/application-logger/tree/master/docs) • [🐛 Report Bug](https://github.com/dennisvanbeersel/symfony-logger-client/issues) • [💬 Discussions](https://github.com/dennisvanbeersel/application-logger/discussions)

[⬆ Back to Top](#applogger---symfony-bundle)

###  Health Score

32

—

LowBetter than 72% of packages

Maintenance74

Regular maintenance activity

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity41

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~12 days

Total

5

Last Release

147d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/3aa4a8338c83cf0e75d2ac8f6bca5804837f668e49f6fdacf5fc6a957429db45?d=identicon)[Kibbab](/maintainers/Kibbab)

---

Top Contributors

[![actions-user](https://avatars.githubusercontent.com/u/65916846?v=4)](https://github.com/actions-user "actions-user (8 commits)")

---

Tags

symfonyloggingmonitoringsentryerror-tracking

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/dennisvanbeersel-symfony-logger-client/health.svg)

```
[![Health](https://phpackages.com/badges/dennisvanbeersel-symfony-logger-client/health.svg)](https://phpackages.com/packages/dennisvanbeersel-symfony-logger-client)
```

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[sentry/sentry-symfony

Symfony integration for Sentry (http://getsentry.com)

73761.4M66](/packages/sentry-sentry-symfony)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M152](/packages/sulu-sulu)[justbetter/magento2-sentry

Magento 2 Logger for Sentry

1851.5M3](/packages/justbetter-magento2-sentry)[lordsimal/cakephp-sentry

Sentry plugin for CakePHP

12270.3k](/packages/lordsimal-cakephp-sentry)[inspector-apm/inspector-symfony

Code Execution Monitoring for Symfony applications.

2830.1k2](/packages/inspector-apm-inspector-symfony)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
