I was having a lot of problems displaying log files in the admin area of my application. The Logfiles were being written to following each transaction, and a typical daily log file would be 10MB.
The best available packages would crash and burn with this size of logfile.
I tried both rap2hpoutre/laravel-log-viewer and arcanedev/log-viewer
Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use SplFileInfo;
use File;
class LogsController extends Controller
{
public $perPage = 500;
public function index()
{
$files = $this->getLogfiles();
return view('logs.index')->withFiles($files)->withLog([]);
}
public function show(Request $request, $index)
{
$files = $this->getLogfiles();
$log = collect(file($files[$index]->getPathname(), FILE_IGNORE_NEW_LINES));
$page = intval($request->get('page',1));
$paginator['page'] = $page;
$paginator['total'] = intval(floor($log->count() / $this->perPage))+1;
$log=$log->slice(($page-1) * $this->perPage, $this->perPage);
return view('logs.index')
->withFiles($files)
->withLog($log)
->withP($paginator)
->withIndex($index);
}
protected function getLogFiles()
{
$directory = storage_path('logs');
$logFiles = collect(File::allFiles($directory))
->sortByDesc(function (SplFileInfo $file) {
return $file->getMTime();
});
return $logFiles;
}
}
View (Bootstrap 4 flavour)
@extends('layouts.app')
@section('content')
<div class="container-fluid">
<h5 class="pt-3">Logs</h5 class="pt-3">
<div class='row'>
<div class='col-md-2'>
<ul class='list-group'>
@foreach($files as $key => $file)
<li class='list-group-item'><a href="{{ route('logs.show',$key) }}">{{ $file->getFilename() }}</a></li>
@endforeach
</ul>
</div>
<div class='col-md-10'>
@if(isset($p))
<ul class="pagination">
<li class="page-item @if($p['page']==1) active @endif"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>1]) }}">First</a></li>
@if($p['page']-4 > 1) <li class="page-item disabled"><a class="page-link" href="#">…</a></li>@endif
@if($p['page']-3 > 1) <li class="page-item"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>$p['page']-3]) }}">{{ $p['page']-3 }}</a></li>@endif
@if($p['page']-2 > 1) <li class="page-item"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>$p['page']-2]) }}">{{ $p['page']-2 }}</a></li>@endif
@if($p['page']-1 > 1) <li class="page-item"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>$p['page']-1]) }}">{{ $p['page']-1 }}</a></li>@endif
@if($p['page'] != 1 && $p['page'] != $p['total'] )
<li class="page-item active"><span class="page-link">{{ $p['page'] }}</span></li>
@endif
@if($p['page']+1 < $p['total']) <li class="page-item"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>$p['page']+1]) }}">{{ $p['page']+1 }}</a></li>@endif
@if($p['page']+2 < $p['total']) <li class="page-item"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>$p['page']+2]) }}">{{ $p['page']+2 }}</a></li>@endif
@if($p['page']+3 < $p['total']) <li class="page-item"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>$p['page']+3]) }}">{{ $p['page']+3 }}</a></li>@endif
@if($p['page']+4 < $p['total']) <li class="page-item disabled"><a class="page-link" href="#">…</a></li>@endif
@if($p['total']!=1)
<li class="page-item @if($p['page'] == $p['total']) active @endif"><a class="page-link" href="{{ route('logs.show',['index'=>$index, 'page'=>$p['total']]) }}">Last</a></li>
@endif
</ul>
@endif
<ul class='list-group list-group'>
@foreach($log as $logline)
<li class='list-group-item small
@if(Illuminate\Support\Str::contains($logline, '.CRITICAL:')) list-group-item-danger @endif
@if(Illuminate\Support\Str::contains($logline, '.ERROR:')) list-group-item-warning @endif
'style="padding: 0.25rem 1.25rem;">{{ $logline }}</li>
@endforeach
</ul>
</div>
</div>
</div>
@endsection
Routes
Route::get('/logs', 'LogsController@index')->name('logs');
Route::get('/logs/{index}', 'LogsController@show')->name('logs.show');
Preferably wrapped in Auth Middleware
Thats it. Just add /logs to your navigation
