如何将Laravel用户名添加到nginx的访问日志中?

时间:2016-09-13 17:04:47

标签: php laravel nginx laravel-5 access-log

任何人都知道如何将用户的Laravel用户名包含在访问日志中? 我在Ubuntu 16.04上使用Laravel 5.2和Nginx。

我知道如何将数据添加到Nginx中的访问日志中,但是,如何将信息(在本例中为用户名)从Laravel传递到Nginx以便将该信息添加到访问日志中?

由于

2 个答案:

答案 0 :(得分:1)

我正在做更多的研究,并在这里和那里找到一些小块来实现一个真正的解决方案。

描述

我提出的解决方案是使用中间件设置包含用户名的标头,然后创建包含该标头内容的日志格式,然后清除该标头以使其不会向用户显示 注意:此代码使用的是Laravel 5.2,您可能需要为Laravel 5.3或其他版本稍微调整一下。

设置标题

在Laravel中创建一个中间件,在头文件中设置用户名,如下所示:

<?php 
namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;
use Illuminate\Http\Request;

class UserHeader
{
    protected $auth;

    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    public function handle(Request $request, Closure $next)
    {
        $response = $next($request);
        $user = $this->auth->user();
        if ($user) {
            $response->headers->set('X-Username', $user->name);
        } else {
            $response->headers->set('X-Username', 'Anonymous');
        }
        return $response;
    }
}

然后在app/Http/Kernel.php

中注册中间件
protected $middleware = [
    // ....
    UserHeader::class,
];

这会在响应中添加这样的标题:

X-Username: Administrator

使用标题

现在,我们在Nginx中处理这个标题 我们创建了一个日志格式来使用该变量,我们在$sent_http_x_username

格式中包含/etc/nginx/nginx.conf
log_format with_user_combined '$remote_addr - $sent_http_x_username [$time_local] '
    '"$request" $status $body_bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '$pipe';

然后我们在访问日志/etc/nginx/sites-enabled/mysite.com中使用该格式:

access_log /var/log/nginx/access-mysite.com.log with_user_combined;

可选

然后,我们清除标题,以便它不会传递给用户:

more_clear_headers 'X-Username';

只要您决定将这些信息放在逻辑的任何部分,

保留标题并不代表任何安全问题。

这也可以应用于其他类型的数据,这些数据可能包含在我们的日志中。

我希望这有助于其他人。

答案 1 :(得分:0)

我可能在这里错了,但据我所知,这是不可能的。访问日志由服务器(nginx)写入,以记录服务器上的活动,而不是记录服务器上运行的应用程序的细节。

如果您需要记录哪些用户访问您的Laravel应用程序,您应该为此创建一个单独的日志文件。要链接此&#34;应用程序日志中的条目&#34; (让我们这样称呼)使用访问日志中的条目,您可以编写一个算法,通过比较时间戳和IP地址来链接这些条目。我很清楚这不是一个非常优雅的解决方案,但它可能是最快/最简单的解决方案之一。