By default, Laravel's logger is configured to use a single log file; however, you may customize this behavior as needed. Since Laravel uses the popular Monolog logging library, you can take advantage of the variety of handlers that Monolog offers.
For example, if you wish to use daily log files instead of a single file, you can make the following change to your config/app.php
configuration file:
'log' => 'daily'
Out of the box, Laravel supports single
, daily
, syslog
and errorlog
logging modes. However, you are free to customize the logging for your application as you wish by overriding the ConfigureLogging
bootstrapper class.
If you would like to have complete control over how Monolog is configured for your application, you may use the application's configureMonologUsing
method. You should place a call to this method in your bootstrap/app.php
file right before the $app
variable is returned by the file:
$app->configureMonologUsing(function($monolog) {
$monolog->pushHandler(...);
});
return $app;
The amount of error detail your application displays through the browser is controlled by the debug
configuration option in your config/app.php
configuration file. By default, this configuration option is set to respect the APP_DEBUG
environment variable, which is stored in your .env
file.
For local development, you should set the APP_DEBUG
environment variable to true
. In your production environment, this value should always be false
.
All exceptions are handled by the App\Exceptions\Handler
class. This class contains two methods: report
and render
.
The report
method is used to log exceptions or send them to an external service like BugSnag. By default, the report
method simply passes the exception to the base class where the exception is logged. However, you are free to log exceptions however you wish. If you need to report different types of exceptions in different ways, you may use the PHP instanceof
comparison operator:
/**
* Report or log an exception.
*
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
*
* @param \Exception $e
* @return void
*/
public function report(Exception $e)
{
if ($e instanceof CustomException) {
//
}
return parent::report($e);
}
The dontReport
property of the exception handler contains an array of exception types that will not be logged. By default, exceptions resulting from 404 errors are not written to your log files. You may add other exception types to this array as needed.
The render
method is responsible for converting the exception into an HTTP response that should be sent back to the browser. By default, the exception is passed to the base class which generates a response for you. However, you are free to check the exception type or return your own custom response:
/**
* Render an exception into an HTTP response.
*
* @param \Illuminate\Http\Request $request
* @param \Exception $e
* @return \Illuminate\Http\Response
*/
public function render($request, Exception $e)
{
if ($e instanceof CustomException) {
return response()->view('errors.custom', [], 500);
}
return parent::render($request, $e);
}
Some exceptions describe HTTP error codes from the server. For example, this may be a "page not found" error (404), an "unauthorized error" (401) or even a developer generated 500 error. In order to return such a response, use the following:
abort(404);
Optionally, you may provide the response text:
abort(403, 'Unauthorized action.');
This method may be used at any time during the request's lifecycle.
Laravel makes it easy to return custom error pages for various HTTP status codes. For example, if you wish to customize the error page for 404 HTTP status codes, create a resources/views/errors/404.blade.php
. This file will be served on all 404 errors generated by your application.
The views within this directory should be named to match the HTTP status code they correspond to.
The Laravel logging facilities provide a simple layer on top of the powerful Monolog library. By default, Laravel is configured to create daily log files for your application which are stored in the storage/logs
directory. You may write information to the logs using the Log
facade:
<?php namespace App\Http\Controllers;
use Log;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show the profile for the given user.
*
* @param int $id
* @return Response
*/
public function showProfile($id)
{
Log::info('Showing user profile for user: '.$id);
return view('user.profile', ['user' => User::findOrFail($id)]);
}
}
The logger provides the seven logging levels defined in RFC 5424: debug, info, notice, warning, error, critical, and alert.
Log::debug($error);
Log::info($error);
Log::notice($error);
Log::warning($error);
Log::error($error);
Log::critical($error);
Log::alert($error);
An array of contextual data may also be passed to the log methods. This contextual data will be formatted and displayed with the log message:
Log::info('User failed to login.', ['id' => $user->id]);
Monolog has a variety of additional handlers you may use for logging. If needed, you may access the underlying Monolog instance being used by Laravel:
$monolog = Log::getMonolog();
You may also register an event to catch all messages passed to the log:
Log::listen(function($level, $message, $context) {
//
});