Table of Contents
Different methods to clean Laravel logs
There are several methods to clean Laravel logs, depending on the specific logs you want to clean and how you want to do it. Here are some common methods:
- Manual deletion: You can manually delete the log files in the storage/logs directory. This is a quick and easy method, but it's not automated and can lead to issues if you accidentally delete important logs.
- Logrotate: You can use the logrotate utility to automatically rotate log files and keep them at a manageable size. Logrotate can be configured to compress and/or delete old log files based on a variety of criteria, such as file size or age.
- Daily log pruning: Laravel has a built-in feature that allows you to prune old log files on a daily basis. To use this feature, add the following line to your app/Console/Kernel.php file:
$schedule->command('log:clear')->daily();
This will run the log:clear
Artisan command once a day, which will delete all log files that are older than the specified number of days (by default, 5 days).
- Custom log pruning: You can create a custom command to prune logs based on your own criteria. For example, you could delete logs that are older than a certain number of days, or delete logs that have a certain filename or extension. You can then add this command to your app/Console/Kernel.php file and schedule it to run on a regular basis.
Method-1: Manual deletion
Manually clean log files
The simplest way to clean Laravel logs is to echo nothing in the log file.
Input
cat storage/logs/laravel.log | wc -l echo "" > storage/logs/laravel.log cat storage/logs/laravel.log | wc -l
Output
steve@thisHostname:~/lara_app$ cat storage/logs/laravel.log | wc -l 52 steve@thisHostname:~/lara_app$ echo "" > storage/logs/laravel.log steve@thisHostname:~/lara_app$ cat storage/logs/laravel.log | wc -l 1
The log file now has 1 line holding an empty space.
Truncate the file to a size of zero
Let's clean the logs by truncating the file to a size of zero 0
.
Input
cat storage/logs/laravel.log | wc -l truncate -s 0 storage/logs/laravel.log cat storage/logs/laravel.log | wc -l
Output
steve@thisHostname:~/lara_app$ cat storage/logs/laravel.log | wc -l 50 steve@thisHostname:~/lara_app$ truncate -s 0 storage/logs/laravel.log steve@thisHostname:~/lara_app$ cat storage/logs/laravel.log | wc -l 0
Use vim key bindings
You can also open the logs file in a text editor, manually select all lines, and delete them. For instance, let's open the file in vim.
vim storage/logs/laravel.log
Select and delete all the lines using the following key bindings ggdG
, where (in normal mode) gg
moves the cursor to the first line and d
deletes the lines to the end of the file G
. Lastly, save and quit the updated file :wq
.
Output
steve@thisHostname:~/lara_app$ cat storage/logs/laravel.log | wc -l 49 steve@thisHostname:~/lara_app$ vim storage/logs/laravel.log steve@thisHostname:~/lara_app$ cat storage/logs/laravel.log | wc -l 0
Use the rm command
Additionally, you can clean Laravel logs by removing the log file.
Input
cat storage/logs/laravel.log | wc -l rm storage/logs/laravel.log ls storage/logs/
Output
steve@thisHostname:~/lara_app$ cat storage/logs/laravel.log | wc -l 49 steve@thisHostname:~/lara_app$ rm storage/logs/laravel.log steve@thisHostname:~/lara_app$ ls storage/logs/ steve@thisHostname:~/lara_app$
Method-2: Create log cleaning function
Let's write a custom log-cleaning function in the routes/console.php
.
// location: routes/console.php
// run: php artisan logs:clean
artisan::command('logs:clean', function() {
exec('rm -f ' . storage_path('logs/*.log'));
exec('rm -f ' . base_path('*.log'));
$this->comment('Logs cleaned!');
})->describe('Clean the log files');
The callback function removes all files ending in .log
then leaves a message Logs cleaned!
Here is a replica of the command in Windows.
// location: routes/console.php
// run: php artisan logs:clean
artisan::command('logs:clean', function() {
array_map('unlink', array_filter((array) glob(storage_path('logs/*.log'))));
$this->comment('Logs cleaned!');
})->describe('Clean the log files');
Apart from writing a custom artisan command, you can automate the process with packages like logcleaner.
Method-3: Custom Log Pruning
To create a custom command to prune logs based on your own criteria, you can follow these steps:
Create a new command using the php artisan make:command
command. For example, to create a command called log:prune
, run:
php artisan make:command log:prune
Open the new app/Console/Commands/LogPrune.php
file that was generated and add the following code to the handle
method:
use Illuminate\Support\Facades\File;
public function handle()
{
$logPath = storage_path('logs/');
$files = File::glob($logPath . '*.log');
foreach ($files as $file) {
$lastModified = File::lastModified($file);
$daysOld = floor((time() - $lastModified) / (60 * 60 * 24));
if ($daysOld > 7) {
File::delete($file);
}
}
}
This code gets a list of all log files in the storage/logs
directory, calculates how many days old each file is, and deletes any files that are older than 7 days.
Add the new command to the $commands
array in the app/Console/Kernel.php
file:
protected $commands = [
Commands\LogPrune::class,
];
Schedule the command to run on a regular basis using Laravel's scheduler. For example, to run the command once a week on Sundays at midnight, add the following line to the schedule
method in Kernel.php
:
$schedule->command('log:prune')->weeklyOn(0, '0:00');
Method-4: Daily Log Pruning
To prune logs on a daily basis using Laravel's built-in feature, add the following line to your app/Console/Kernel.php
file:
protected function schedule(Schedule $schedule)
{
$schedule->command('log:clear')->daily();
}
This will run the log:clear
Artisan command once a day at midnight, which will delete all log files that are older than the specified number of days (by default, 5 days).
Conclusion
In summary, cleaning Laravel logs is an important task that helps keep your application running smoothly and prevents log files from becoming too large and unmanageable. There are several methods you can use to clean logs, including manual deletion, logrotate, daily log pruning, and custom log pruning.
Manual deletion is a quick and easy method but requires manual intervention and may lead to issues if important logs are accidentally deleted. Logrotate is a useful tool that can be configured to automatically rotate logs and delete old files based on various criteria.
Laravel provides a built-in command for daily log pruning that can be scheduled to run automatically using the Laravel scheduler. Additionally, you can create a custom command to prune logs based on your own criteria and schedule it to run on a regular basis.
The best method for cleaning logs in your application will depend on your specific needs and the size and complexity of your log files. By regularly cleaning your logs, you can ensure that your application remains efficient and easy to manage.