PHPackages                             laboiteacode/filament-logs-explorer - 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. laboiteacode/filament-logs-explorer

ActiveLibrary[Logging &amp; Monitoring](/categories/logging)

laboiteacode/filament-logs-explorer
===================================

Read and search your Laravel log files without leaving your Filament panel.

v1.0.1(1mo ago)52.6k1MITPHPPHP ^8.2CI passing

Since Jul 17Pushed 1mo agoCompare

[ Source](https://github.com/La-boite-a-code/filament-logs-explorer)[ Packagist](https://packagist.org/packages/laboiteacode/filament-logs-explorer)[ Docs](https://github.com/la-boite-a-code/filament-logs-explorer)[ RSS](/packages/laboiteacode-filament-logs-explorer/feed)WikiDiscussions main Synced 1w ago

READMEChangelog (3)Dependencies (16)Versions (6)Used By (1)

Filament Logs Explorer
======================

[](#filament-logs-explorer)

[![Latest Version on Packagist](https://camo.githubusercontent.com/dc63a2caccf54e5727c0402119dffd192d08d36e6e54545b83387f9fba51e486/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f6c61626f69746561636f64652f66696c616d656e742d6c6f67732d6578706c6f7265722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/laboiteacode/filament-logs-explorer)[![Tests](https://camo.githubusercontent.com/91cf5030cdf5b91ea2ed53e12a9874d3a1cdc12ce4f16602aa3687ab49b80b22/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f6c612d626f6974652d612d636f64652f66696c616d656e742d6c6f67732d6578706c6f7265722f72756e2d74657374732e796d6c3f6272616e63683d6d61696e266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/la-boite-a-code/filament-logs-explorer/actions/workflows/run-tests.yml)[![Total Downloads](https://camo.githubusercontent.com/a7cdc57aab67f592a15e17e1f83199712f8c0306fa4815457813025224ea0b43/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6c61626f69746561636f64652f66696c616d656e742d6c6f67732d6578706c6f7265722e7376673f7374796c653d666c61742d737175617265)](https://packagist.org/packages/laboiteacode/filament-logs-explorer)[![License](https://camo.githubusercontent.com/f878dc4707015dfc1356cd02cede122fe441977569c5a01a289f1fb8ef643485/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f6c61626f69746561636f64652f66696c616d656e742d6c6f67732d6578706c6f7265722e7376673f7374796c653d666c61742d737175617265)](LICENSE.md)

Read your Laravel log files without leaving your Filament panel. Files are grouped by logging channel and open in a slide-over with in-file search, match navigation and keyboard shortcuts.

[![Filament Logs Explorer](art/banner.jpg)](art/banner.jpg)

Features
--------

[](#features)

- **Channel aware.** Log files are resolved from your `config/logging.php`, not from a hardcoded path: `single`, `daily`, `monolog` stream handlers, and the file based members of a `stack`.
- **Slide-over viewer.** In-file search with highlighting and match navigation, jump to start or end, move to the previous or next file without closing the slide-over, and download the raw file.
- **Keyboard driven.** `/` to search, `n` and `N` to walk through matches, `g` and `G` to jump to the start or the end of the file.
- **Safe on large files.** Files above a configurable size are truncated, and the viewer loads the end of the file first so the most recent entries are always the ones you see.
- **File deletion.** Delete a log file from the list or from the viewer, behind a confirmation dialog and its own authorization hook, independent of read access.
- **Configurable twice over.** Every option is available both in a published config file and through a fluent, per-panel plugin API.
- **Authorization built in.** A single `canAccess()` hook drives both the navigation item and the route.
- **Translated.** Ships with English, French and Spanish.

Compatibility
-------------

[](#compatibility)

PackageSupported versionsPHP8.2, 8.3, 8.4, 8.5Laravel12, 13Filament4, 5Installation
------------

[](#installation)

Install the package with Composer:

```
composer require laboiteacode/filament-logs-explorer
```

Register the plugin on every panel where it should appear, usually in `app/Providers/Filament/AdminPanelProvider.php`:

```
use LaBoiteACode\FilamentLogsExplorer\FilamentLogsExplorerPlugin;

public function panel(Panel $panel): Panel
{
    return $panel
        // ...
        ->plugin(FilamentLogsExplorerPlugin::make());
}
```

That is the whole setup. A **Logs** entry appears in the navigation and lists every file based channel the plugin can find.

### Assets

[](#assets)

The viewer's CSS and JS are registered with Filament automatically. In production, publish them like any other Filament asset:

```
php artisan filament:assets
```

### Publishing

[](#publishing)

All three publishable groups are optional:

```
# config/filament-logs-explorer.php
php artisan vendor:publish --tag="filament-logs-explorer-config"

# lang/vendor/filament-logs-explorer/{locale}/filament-logs-explorer.php
php artisan vendor:publish --tag="filament-logs-explorer-translations"

# resources/views/vendor/filament-logs-explorer/
php artisan vendor:publish --tag="filament-logs-explorer-views"
```

Usage
-----

[](#usage)

### The Logs page

[](#the-logs-page)

The page renders one collapsible section per channel, each showing that channel's most recent files with their name, size and last modified date. A **Refresh** action in the header re-scans the disk.

Clicking a file opens it in the viewer. Files the process cannot read are listed but marked as unreadable, so a permission problem is visible instead of silent.

### The viewer

[](#the-viewer)

ActionHowSearch in the fileType in the search box, matches are highlightedJump between matchesThe up and down buttons, or `n` and `N`Go to the start or end of the fileThe two buttons, or `g` and `G`Open the previous or next fileThe `` buttons, without closing the slide-overFocus the search box`/`Download the raw fileThe download buttonDelete the fileThe trash button, after a confirmationWhile the search box has focus, `Enter` moves to the next match, `Shift+Enter`to the previous one, and `Escape` clears the search. The single letter shortcuts are only active outside the search box, so typing `n` in a query does what you expect.

### Large files

[](#large-files)

Files larger than `reader.max_bytes` (5 MB by default) are truncated. The viewer loads the **end** of the file, which is where the most recent entries are, and shows a banner explaining that the file was truncated and inviting the user to download it in full. Set `reader.tail_when_exceeded` to `false` to load the beginning instead.

Configuration
-------------

[](#configuration)

Every option can be set **globally** in the published `config/filament-logs-explorer.php`, or **per panel** through the fluent plugin API. The fluent value always wins, which lets several panels in the same application expose different subsets of the logs.

### Channels

[](#channels)

By default the plugin auto-discovers every file based channel declared in `config/logging.php`. Provide an explicit list to restrict and order them:

```
// config/filament-logs-explorer.php
'channels' => ['daily', 'single'],  // empty array => auto-discover
'exclude_channels' => ['emergency'],
'expand_stacks' => true,            // expand "stack" channels into their members
'files_per_channel' => 15,
```

```
FilamentLogsExplorerPlugin::make()
    ->channels(['daily', 'single'])
    ->excludeChannels(['emergency'])
    ->expandStacks()
    ->filesPerChannel(20);
```

### Untracked files

[](#untracked-files)

To also surface `*.log` files that are not attached to any channel, enable the directory scan. Those files are grouped under their own section:

```
'discover_untracked_files' => true,
'log_directory' => null,             // null => storage_path('logs')
'untracked_channel_label' => null,   // null => the translated label
```

```
FilamentLogsExplorerPlugin::make()
    ->discoverUntrackedFiles(directory: storage_path('logs'));
```

### Navigation

[](#navigation)

```
FilamentLogsExplorerPlugin::make()
    ->navigationLabel('Application logs')
    ->navigationIcon('heroicon-o-bug-ant')
    ->activeNavigationIcon('heroicon-s-bug-ant')
    ->navigationGroup('System')
    ->navigationSort(99)
    ->navigationParentItem('Tools')
    ->navigationBadge()          // show the number of channels as a badge
    ->registerNavigation(false)  // keep the route, hide the menu entry
    ->slug('application-logs');
```

To nest the page inside a Filament cluster, pass its class name:

```
FilamentLogsExplorerPlugin::make()
    ->cluster(SystemCluster::class);
```

### Access control

[](#access-control)

The page is available to anyone who can access the panel. Restrict it with a Gate ability:

```
'authorization' => [
    'gate' => 'view-logs',
],
```

Or with a closure, which takes precedence over the configured gate:

```
FilamentLogsExplorerPlugin::make()
    ->canAccessUsing(fn (): bool => auth()->user()?->can('viewLogs') ?? false);
```

Either way this drives the page's `canAccess()` method, so it controls the navigation visibility and the route authorization at once.

### Deleting log files

[](#deleting-log-files)

Deletion is **enabled by default** and has its own authorization, separate from read access, so people can browse logs without being able to delete them. The trash button asks for confirmation before removing the file from disk, and deleting the file currently open also closes the slide-over.

```
'deletion' => [
    'enabled' => true,
    'gate' => 'delete-logs',  // null => anyone who can access the page
],
```

```
// Hide the delete buttons entirely.
FilamentLogsExplorerPlugin::make()->deletable(false);

// Or decide per user.
FilamentLogsExplorerPlugin::make()
    ->canDeleteUsing(fn (): bool => auth()->user()?->can('deleteLogs') ?? false);
```

Files are always resolved back from an opaque id, never from a path sent by the browser, so only files the plugin listed itself can be deleted, and the check runs again server side before the file is removed.

### Reader

[](#reader)

```
'reader' => [
    'max_bytes' => 5 * 1024 * 1024,
    'tail_when_exceeded' => true,
],
```

```
FilamentLogsExplorerPlugin::make()
    ->maxBytes(10 * 1024 * 1024)
    ->tailWhenExceeded();
```

### Reference

[](#reference)

Config keyFluent methodDefault`navigation.register``registerNavigation()``true``navigation.label``navigationLabel()`translated "Logs"`navigation.icon``navigationIcon()``heroicon-o-document-magnifying-glass``navigation.active_icon``activeNavigationIcon()``heroicon-s-document-magnifying-glass``navigation.group``navigationGroup()``null``navigation.sort``navigationSort()``null``navigation.parent_item``navigationParentItem()``null``navigation.badge``navigationBadge()``false``slug``slug()``logs``cluster``cluster()``null``channels``channels()``[]` (auto-discover)`exclude_channels``excludeChannels()``[]``expand_stacks``expandStacks()``true``discover_untracked_files``discoverUntrackedFiles()``false``log_directory``logDirectory()``null` (`storage_path('logs')`)`untracked_channel_label`none`null` (translated label)`files_per_channel``filesPerChannel()``15``reader.max_bytes``maxBytes()``5242880` (5 MB)`reader.tail_when_exceeded``tailWhenExceeded()``true``authorization.gate``canAccessUsing()``null``deletion.enabled``deletable()``true``deletion.gate``canDeleteUsing()``null`Translations
------------

[](#translations)

The package ships with **English**, **French** and **Spanish**, and follows your application locale. Publish the files to change the wording or to add a language:

```
php artisan vendor:publish --tag="filament-logs-explorer-translations"
```

Then edit or create `lang/vendor/filament-logs-explorer/{locale}/filament-logs-explorer.php`.

Security
--------

[](#security)

The viewer only ever reads files it resolved itself from your logging configuration. The front end references files by an opaque, non-reversible id rather than by path, so a path supplied by the browser is never read from disk, and both reading and deleting are re-authorized server side.

If you discover a security issue, please email  rather than using the issue tracker.

Testing
-------

[](#testing)

```
composer test      # Pest
composer analyse   # PHPStan / Larastan
composer format    # Pint
```

Changelog
---------

[](#changelog)

See [CHANGELOG.md](CHANGELOG.md) for what has changed recently.

Credits
-------

[](#credits)

- [La boîte à code](https://laboiteacode.fr)
- [Alexandre Ribes](https://alexandre-ribes.fr)

License
-------

[](#license)

The MIT License (MIT). See [LICENSE.md](LICENSE.md) for more information.

###  Health Score

48

—

FairBetter than 94% of packages

Maintenance92

Actively maintained with recent releases

Popularity28

Limited adoption so far

Community10

Small or concentrated contributor base

Maturity50

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 91.7% 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 ~1 days

Total

5

Last Release

39d ago

Major Versions

v0.3.0 → v1.0.02026-07-22

### Community

Maintainers

![](https://www.gravatar.com/avatar/7fd1bf4d557c8949ae533b8e84a5b90bf966d491397089abc0fb6e97cb3569cb?d=identicon)[Alexandre Ribes](/maintainers/Alexandre%20Ribes)

---

Top Contributors

[![RibesAlexandre](https://avatars.githubusercontent.com/u/818564?v=4)](https://github.com/RibesAlexandre "RibesAlexandre (11 commits)")[![dependabot[bot]](https://avatars.githubusercontent.com/in/29110?v=4)](https://github.com/dependabot[bot] "dependabot[bot] (1 commits)")

---

Tags

laravellogginglogslog viewerfilamentfilamentphplaboiteacode

###  Code Quality

TestsPest

Static AnalysisPHPStan

Code StyleLaravel Pint

### Embed Badge

![Health badge](/badges/laboiteacode-filament-logs-explorer/health.svg)

```
[![Health](https://phpackages.com/badges/laboiteacode-filament-logs-explorer/health.svg)](https://phpackages.com/packages/laboiteacode-filament-logs-explorer)
```

###  Alternatives

[rawilk/profile-filament-plugin

Profile &amp; MFA starter kit for filament.

3915.5k](/packages/rawilk-profile-filament-plugin)[tapp/filament-maillog

Filament plugin to view outgoing mail

3084.0k1](/packages/tapp-filament-maillog)[codewithdennis/filament-select-tree

The multi-level select field enables you to make single selections from a predefined list of options that are organized into multiple levels or depths.

331634.0k37](/packages/codewithdennis-filament-select-tree)[finity-labs/fin-mail

A powerful email template manager and composer for Filament with dynamic token replacement, template versioning, and inline email sending.

316.8k2](/packages/finity-labs-fin-mail)[stephenjude/filament-jetstream

A Laravel starter kit built with Filament inspired by Jetstream.

17863.7k3](/packages/stephenjude-filament-jetstream)[mradder/filament-logger

Audit logging, activity tracking, exports, alerts, and dashboards for Filament admin panels.

2324.4k2](/packages/mradder-filament-logger)

PHPackages © 2026

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