任何人都知道如何将用户的Laravel用户名包含在访问日志中? 我在Ubuntu 16.04上使用Laravel 5.2和Nginx。
我知道如何将数据添加到Nginx中的访问日志中,但是,如何将信息(在本例中为用户名)从Laravel传递到Nginx以便将该信息添加到访问日志中?
由于
答案 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地址来链接这些条目。我很清楚这不是一个非常优雅的解决方案,但它可能是最快/最简单的解决方案之一。