achyutn/filament-log-viewer

A Filament package to view and manage Laravel logs.

Maintainers

Package info

github.com/achyutkneupane/filament-log-viewer

pkg:composer/achyutn/filament-log-viewer

Transparency log

Statistics

Installs: 209 632

Dependents: 30

Suggesters: 0

Stars: 51

Open Issues: 0


README

Filament Log Viewer

Packagist Version Packagist Downloads Packagist Stars Lint & Test PR Bump version

A Filament plugin to read and display Laravel log files in a clean, searchable table with stack traces and filtering.

Refer to version compatibility table below to ensure you are using the correct version of this package with your Filament installation.

Installation

composer require achyutn/filament-log-viewer

Register the plugin inside your Filament panel:

use AchyutN\FilamentLogViewer\FilamentLogViewer;

return $panel
    ->plugins([
        FilamentLogViewer::make(),
    ]);

Laravel Boost Integration

This package provides a Laravel Boost skill for AI-assisted development. When you install Laravel Boost in your project, the skill will be automatically discovered and made available to AI agents.

See Laravel Boost documentation for more details.

Usage

After installation, visit /logs in your Filament panel. You will see a table of log entries.

Configuration

You can configure the maximum file size limit for log files to be loaded and displayed. This helps prevent performance issues with very large log files.

The default file size limit is set to 2 MB. To override these settings, you can set environment variables in your .env file:

LOG_MAX_SIZE_KB=20480
LOG_ENABLE_DELETE=false
LOG_ENABLE_COPY_MARKDOWN=false
LOG_COPY_MARKDOWN_LEVELS=error,warning
LOG_DISABLE_CACHE=false
  • Set LOG_MAX_SIZE_KB to the maximum log file size in kilobytes (e.g., 20480 for 20 MB).
  • Set LOG_ENABLE_DELETE=false in production to disable the Clear Logs button and protect log files from accidental deletion.
  • Set LOG_ENABLE_COPY_MARKDOWN=false to disable the Copy as Markdown button.
  • Set LOG_COPY_MARKDOWN_LEVELS to comma-separated list of log levels that show the copy button (e.g., error,warning or just error).
  • Set LOG_DISABLE_CACHE=true to skip caching parsed log rows between requests.

Or, you can publish the configuration file and update the max_log_file_size value as needed:

php artisan vendor:publish --tag=filament-log-viewer-config

Then, in your published config/filament-log-viewer.php file:

return [
    // Set max file size to 20 MB
    'max_log_file_size' => env('LOG_MAX_SIZE_KB', 20480),

    // Disable deleting logs from the UI
    'enable_delete' => env('LOG_ENABLE_DELETE', false),

    // Disable copying logs as markdown
    'enable_copy_markdown' => env('LOG_ENABLE_COPY_MARKDOWN', true),

    // Show copy button for these log levels (comma-separated)
    'copy_markdown_levels' => explode(',', env('LOG_COPY_MARKDOWN_LEVELS', 'error')),

    // Skip caching parsed log rows between requests
    'disable_cache' => env('LOG_DISABLE_CACHE', false),
];

Caching

Parsed log rows are cached between requests using Laravel's cache. The cache is keyed by a fingerprint of the log files (name, size, and modification time), so it invalidates automatically whenever a log file changes — no TTL or manual flush is needed. The rows are stored under a single cache key to avoid accumulating stale entries. Set disable_cache to true to disable the cache entirely.

Table Columns

  • Log Level – Badge with color mapped from log level
  • Environment (Toggleable) – Application environment (local, production, etc.)
  • File (Toggleable) – Log file name (e.g., laravel.log)
  • Message – Short summary of the log
  • Occurred – Human-readable date/time
  • Copy as Markdown – Action to copy log details in a clean Markdown format.

Table Preview

Click the view action to inspect stack traces.

Stack Tracing

Mail Preview

If your logs contain mail messages, you can preview them directly from the table. You can click on Mail tab which is visible only if mail are present.

Mail Preview

Clear Logs

The Clear Logs button clears every log file. When multiple log files exist, a chevron icon button next to it opens a dropdown listing each file — select one to truncate just that file, leaving the others intact. The per-file dropdown is hidden when only one log file exists, and both controls are hidden when enable_delete is false.

Filters

Log Levels

You can filter the logs according to log level. The filters are available as tabs above the table:

Log level Filters

Date

You can filter logs by date using the date picker in the top right corner of the table. This allows you to select a specific date range to view logs.

Date Filter

Toggle Columns

You can toggle the visibility of the Environment and File columns by clicking the eye icon in the top right corner of the table.

Toggle Columns

Authorization

You can make a boolean check to authorize the log viewer. It will be helpful if you want to show/hide the log viewer for certain cases.

Example

You simply return a boolean or Closure which evaluates to a boolean.

FilamentLogViewer::make()
    ->authorize(true);

// or

FilamentLogViewer::make()
    ->authorize(fn (): bool => auth()->user()->is_admin);

If you are using filament-sheild or any other external services for authorization, you can use a Closure with permission check:

FilamentLogViewer::make()
    ->authorize(fn (): bool => auth()->check() && auth()->user()->can('View:LogTable'));

Extending

You can customize navigation label, icon, sort, etc. using:

use AchyutN\FilamentLogViewer\FilamentLogViewer;

FilamentLogViewer::make()
    ->authorize(fn () => auth()->check())
    ->registerNavigation(true)
    ->navigationGroup('System')
    ->navigationIcon('heroicon-o-document-text')
    ->navigationLabel('Log Viewer')
    ->navigationSort(10)
    ->navigationUrl('/logs')
    ->pollingTime(null); // Set to null to disable polling

Set ->registerNavigation(false) if you want to hide Log Viewer from the sidebar while still linking to it directly (for example, from a custom dashboard action).

Swapping Components

Every component is replaceable through the plugin — either by implementing its contract interface or by extending the default implementation:

Plugin method Contract Default
pageClass() LogViewerPage (extends HasTable) LogTable
providerClass() LogProvider LocalLogProvider
parserClass() LogParser FileLogParser
mailParserClass() MailParser DefaultMailParser
stackTraceParserClass() StackTraceParser DefaultStackTraceParser
tableSchemaClass() LogTableSchemaInterface LogTableSchema
errorSchemaClass() LogEntrySchemaInterface ErrorLogSchema
jsonSchemaClass() LogEntrySchemaInterface JSONLogSchema
mailSchemaClass() LogEntrySchemaInterface MailLogSchema
copyMarkdownActionClass() Filament\Actions\Action CopyMarkdownAction
dateRangeFilterClass() DateRangeFilter
fileFilterClass() FileFilter

Providers may additionally implement CanDeleteLogs (deleteAll(), deleteFile()). The Clear Logs and per-file clear controls only render when the bound provider implements it.
Defaults are non-final with protected extension points, so you can swap in a fully custom implementation or extend a default and override a single behavior:

use AchyutN\FilamentLogViewer\Contracts\LogProvider;
use AchyutN\FilamentLogViewer\FilamentLogViewer;
use AchyutN\FilamentLogViewer\Providers\LocalLogProvider;

class CloudLogProvider extends LocalLogProvider implements LogProvider
{
    protected function getAllLogFiles(): array
    {
        return ['cloud.log', 'scheduler.log'];
    }
}

FilamentLogViewer::make()
    ->providerClass(CloudLogProvider::class)
    ->parserClass(MyParser::class)          // implements LogParser or extends FileLogParser
    ->errorSchemaClass(MyErrorSchema::class);

Overrides are resolved through Laravel's service container, so constructor dependencies are auto-wired. Because the plugin is registered as a container singleton, the provider and parser classes apply app-wide rather than per-panel.

Backward compatibility: The AchyutN\FilamentLogViewer\Model\Log class remains as a static facade that delegates to the container-resolved LogProvider. Existing calls such as Log::getRows(), Log::getLogCount(), or Log::getAllLogFiles() keep working unchanged. New code should use the LogProvider contract (or a providerClass() override) directly instead of the facade.

Localization

Filament Log Viewer includes built-in translations for:

Translations are applied automatically based on your application's current locale.

Missing your language? Feel free to submit a PR to add it!

Filament Compatibility

Version Filament Version
^2.x Filament v5
^1.x Filament v4
^0.x Filament v3

Make sure you're using the appropriate version of this package for your Filament installation.

License

This package is open-sourced software licensed under the MIT license.

Changelog

See the CHANGELOG for details on changes made in each version.

Contributing

Contributions are welcome! Please create a pull request or open an issue if you find any bugs or have feature requests.

Support

If you find this package useful, please consider starring the repository on GitHub to show your support.