you can change the hardcoded path at vendor/laravel/... . but that's truly no elegant solution. there probably is a better solution.
You can do this by extending the default Illuminate\Foundation\Bootstrap\ConfigureLogging bootstraper class and then registering it with the Kernel. The following code sets the custom paths for daily and single config settings:
file:/// app/Bootstrap/ConfigureLogging.php:
<?php namespace App\Bootstrap;
use Illuminate\Log\Writer;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Bootstrap\ConfigureLogging as BaseLoggingConfiguration;
class ConfigureLogging extends BaseLoggingConfiguration {
/**
* Configure the Monolog handlers for the application.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Log\Writer $log
* @return void
*/
protected function configureSingleHandler(Application $app, Writer $log)
{
//sets the path to custom app/log/single-xxxx-xx-xx.log file.
$log->useFiles(base_path() . '/log/single.log');
}
/**
* Configure the Monolog handlers for the application.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Log\Writer $log
* @return void
*/
protected function configureDailyHandler(Application $app, Writer $log)
{
//sets the path to custom app/log/daily-xxxx-xx-xx.log file.
$log->useDailyFiles(base_path() . '/logs/daily.log', 5);
}
}
Now register it with the kernel by adding the following code inside your app/Http/Kernel.php file:
use Illuminate\Routing\Router;
use Illuminate\Contracts\Foundation\Application;
.....
......
/**
* Create a new HTTP kernel instance.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Routing\Router $router
* @return void
*/
public function __construct(Application $app, Router $router)
{
parent::__construct($app, $router);
array_walk($this->bootstrappers, function(&$bootstrapper)
{
if($bootstrapper === 'Illuminate\Foundation\Bootstrap\ConfigureLogging')
{
$bootstrapper = 'App\Bootstrap\ConfigureLogging';
}
});
}
....
....
This will only set the paths for Http Kernel, for console you will need to add the above code inside the app/Console/Kernel.php as well.
Usman.
PS: Make sure that your custom directory is writable by web server user.
I did something like this in the app provider
if(env('APP_LOG_TYPE') == 'single') {
$this->app->instance('log', new \Illuminate\Log\Writer(
(new Logger(
$this->app->environment()
))->pushHandler(new StreamHandler(env('APP_LOG_PATH')))
)
);
}
I don't like the idea of having to edit the Kernel for http and console. For those who share my sentiment, you can look unto the solution I've come up with http://stackoverflow.com/a/43800364/4069872.
For the next person... looks like now you can just extend the Illuminate\Log\LogServiceProvider, but similar to original example.
namespace App\Providers;
use Illuminate\Log\LogServiceProvider;
use Illuminate\Log\Writer;
class CustomLogServiceProvider extends LogServiceProvider {
/**
* Configure the Monolog handlers for the application.
*
* @param \Illuminate\Log\Writer $log
* @return void
*/
protected function configureSingleHandler(Writer $log)
{
//sets the path to custom app/log/single-xxxx-xx-xx.log file.
$log->useFiles($this->_getLogPath() . '/single.log');
}
/**
* Configure the Monolog handlers for the application.
*
* @param \Illuminate\Log\Writer $log
* @return void
*/
protected function configureDailyHandler(Writer $log)
{
//sets the path to custom app/log/daily-xxxx-xx-xx.log file.
$log->useDailyFiles($this->_getLogPath() . '/daily.log', 0, config('app.log_level', 'debug'));
}
private function _getLogPath() {
$storage_path = config('app.storage', base_path() . DIRECTORY_SEPARATOR . 'storage');
return $storage_path . DIRECTORY_SEPARATOR . 'logs';
}
}
Sign in to participate in this thread!
The Laravel portal for problem solving, knowledge sharing and community building.