Laravel:更改日志路径以包含用户文件夹

时间:2015-10-21 17:22:02

标签: laravel laravel-5 laravel-5.1

我使用Laravel 5.1,我试图拦截默认记录器配置(Monolog)并将日志保存到包含用户名的其他路径。

当前日志保存到storage / logs / laravel.log。

所需路径如下

经过身份验证的用户:存储/日志/ [用户名] / [日期] _ [api_path] .log

其他用户日志可以保存在storage / logs / guest / [date] _ [api_path] .log

ServiceProvider方法

拥有 LogServiceProvider ,我可以在其中修改每个请求并根据需要设置路径。

public function boot(Request $request)
{

    $log = new Logger('View Logs');
    $user = \Auth::User()->getName(); // ERROR - uninitialized
    $path = 'storage/logs/'.$user.'/mylogfile.log'; // doesn't matter API path
    $log ->pushHandler(new StreamHandler($path, Logger::INFO));
    ...
 }

这种方法存在问题,Auth :: user()似乎未初始化。

为什么会发生这种情况,我该如何解决?

2 个答案:

答案 0 :(得分:1)

您可能需要将其包装在if语句中,例如:

if ( Auth::check() ) {
  // Do auth stuff
}
else {
  // Do unauth stuff
}

这能解决您的问题吗?

答案 1 :(得分:0)

这是因为Auth还没有初始化,调用还为时过早。

有示例方法可以解决:

  • 创建日志初始值设定项,并从中间件(或您想要的任何地方)调用它:
class UserLogger
{
    public function init()
    {
        $logger = new Logger('order');
        $currUserId = Auth::id();
        $logPath = storage_path('logs/by_user/' . $currUserId . '/' . Carbon::now()->toDateString() . '.log');
        $logger->pushHandler(new StreamHandler($logPath, Logger::INFO));

        return $logger;
    }
}
//app\Http\Middleware\Authenticate.php
class Authenticate
{

    public function handle($request, Closure $next, $guard = null)
    {
        $userLogger = new UserLogger();
        $logger = $userLogger->init();
        $context = ['some context data' => 'data'];
        $logger->info('custom user actions', $context);

     //...
  • 可以查看 Laravel 8 版本here