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 provides a robust scheduling system that can be leveraged to create a custom log pruning feature. This allows you to automatically clear old log files on a daily basis. To add this functionality, first create a custom artisan command (e.g.,
log:clear
) that handles the pruning logic. Once you've created and tested this command, you can schedule it to run daily by adding the following line to yourapp/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
You can create a custom artisan command to clear your logs and then schedule that command to run daily. Below is a basic outline of how you might do that:
Create a new command with php artisan make:command ClearLog
.
Open the new command file located in app/Console/Commands/ClearLog.php
.
In the handle()
method, add the logic to clear the log. This might look something like:
public function handle()
{
$file = storage_path('logs/laravel.log');
if (file_exists($file)) {
// Clear the log.
file_put_contents($file, '');
}
$this->info('Logs have been cleared');
return 0;
}
In your Kernel.php
file located in app/Console/
, add your new command to the schedule. This might look something like:
protected function schedule(Schedule $schedule)
{
$schedule->command('log:clear')->daily();
}
Remember to replace 'log:clear'
with whatever you name your command.
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.
“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:”
This is not built-in. You literally describe how you create the command yourself later in the article.
Thank you for highlighting the mistake, I have rectified it.