systemsdk/easy-log-bundle
EasyLogBundle is a Symfony bundle that simplifies application logging with configurable channels, handlers, and structured output. Capture errors and events, attach useful context, and manage PSR-3-compatible logs with minimal setup for development and production.
Know what you are installing first. The v2.1.0 note ("Improved bundle configuration for the latest Symfony framework") tells you this is a Symfony bundle, not a Laravel package. That distinction drives everything below: in a Laravel app you will not get auto-discovery, a config/ publish tag, or a ServiceProvider. You get a bundle class that expects a Symfony Kernel and a Configuration tree.
Start by confirming the shape of the dependency:
composer require <vendor>/<package>:^2.1 — then immediately read the resulting composer.json diff. Check which symfony/framework-bundle, symfony/config, and symfony/dependency-injection constraints it pulled in. If it wants Symfony 7 components, verify they don't collide with the versions Laravel already ships transitively.README.md → composer.json → UPGRADE-2.0.md / CHANGELOG.md → src/DependencyInjection/Configuration.php → src/*Bundle.php. The Configuration.php tree is the contract; the changelog tells you whether v2.1.0 changed node names, defaults, or validation.AbstractBundle-style bundle class (getContainerExtension() returning null) versus the older Extension + Bundle pair. v2.1.0's "improved bundle configuration" almost certainly means the former, or a prependExtensionConfig() addition — that only matters if you extend or decorate the bundle.First real use case: instantiate the bundle's underlying library directly in a tinker session or a test, without booting a Symfony kernel. Most Symfony bundles are thin DI wiring over a standalone component. If that works, you have a usable integration path even if you never register the bundle.
// app(Tests) — prove the payload works before fighting the container
$client = new Vendor\Package\Client(new Vendor\Package\Config([...]));
dump($client->call());
If the note matters to you at all, you are most likely in one of three situations: a legacy Symfony service inside a Laravel monolith, a shared internal package consumed by both frameworks, or a Laravel package that wraps the same vendor library. Read the rest of this assessment with your situation in mind.
1. Consume the library, skip the bundle. This is the default recommendation for Laravel-only shops. Wire the vendor classes in a small ServiceProvider with explicit constructor arguments copied from the bundle's services.yaml. You lose bundle-level conveniences and gain an integration you can actually test.
final class VendorPackageServiceProvider extends ServiceProvider
{
public function register(): void
{
$this->app->singleton(Vendor\Package\Client::class, fn ($app) => new Vendor\Package\Client(
new Vendor\Package\Config(
endpoint: config('services.vendor.endpoint'),
timeout: config('services.vendor.timeout', 5),
),
$app->make(GuzzleHttp\ClientInterface::class),
));
}
}
2. Mirror the config tree in config/services.php. Whatever the bundle exposes under its root alias, translate 1:1 into a Laravel config file and validate it once at boot (a resolving() callback or a config DTO). This is where v2.1.0 bites: if the bundle tightened its tree — a renamed node, a now-required key, a changed default — a naive copy will silently diverge from upstream documentation.
3. Bridge into a real Symfony kernel only if you must. For hybrid apps, register the bundle in bundles.php and load config/packages/<alias>.yaml, then boot that kernel as a secondary container. Treat it as a separate application: its own cache directory, its own APP_ENV, its own warmup step in your deploy.
4. Pin and matrix-test the Symfony constraint. Because v2.1.0 is explicitly "for the latest Symfony framework", add a CI job that installs against both the minimum and maximum allowed Symfony versions (composer update --prefer-lowest alongside your normal install). Bundle config improvements are the classic source of "works on my lockfile" failures.
5. Wrap with a facade or adapter of your own. Anything you call day-to-day should go through your class, not the vendor's. When the bundle changes its config or bumps a major, you edit one file.
extra.laravel.providers entry to lean on. If a README implies bin/console commands work, that is Symfony's console, not php artisan.InvalidConfigurationException, or ->cannotBeEmpty() was added. Run debug:config <alias> (Symfony) or diff your translated config array (Laravel) after upgrading.php artisan cache:clear for the Laravel side; bin/console cache:clear && bin/console cache:warmup for any Symfony kernel you boot. Most "the upgrade broke it" reports are stale cache.symfony/* components. Run composer why symfony/dependency-injection and composer outdated 'symfony/*' before and after the upgrade. A minor bundle release that requires a newer symfony/config will drag your whole tree forward.config/packages/*.yaml. Commit those files and review the diff; do not let flex:sync run unattended.prependExtensionConfig() on the extension and the Configuration tree's ->normalizeKeys(false) / ->ignoreExtraKeys() flags are the levers. v2.1.0 may have changed the defaults on these — read the diff, don't assume.bin/console debug:config <alias>, debug:container --tag=<tag>, and lint:container for Symfony-side issues; Illuminate\Container\Container::getBindings() and a dd() in your provider for the Laravel side. Compare the two when a value is unexpectedly null."<vendor>/<package>": "2.0.*") if you are on an older Symfony. Only adopt v2.1.0 when your Symfony components are current — that is what the release is for.Configuration.php diff, not by the version number.How can I help you explore Laravel packages today?