专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员小灰  ·  小灰筹划6年的“仓鼠币系统”,终于上线了! ·  2 天前  
程序猿  ·  患者带着DeepSeek来看病,医学博主自嘲 ... ·  2 天前  
程序员的那些事  ·  快!快!快!DeepSeek 满血版真是快 ·  2 天前  
码农翻身  ·  中国的大模型怎么突然间就领先了? ·  昨天  
OSC开源社区  ·  Bun ... ·  2 天前  
51好读  ›  专栏  ›  SegmentFault思否

用 nginx 访问日志记录 mysql 数据库中的用户 id

SegmentFault思否  · 公众号  · 程序员  · 2017-09-13 08:00

正文

nginx 有很强大的日志功能,但是在缺省状态下,它只能记录用户的IP地址以及浏览器信息。如果我们有用户登录注册系统,在用户已登录的情况下,想记录访问某一个网页的到底是哪一个用户,怎么办呢?因为我们不只想知道到底是哪一个IP地址访问了哪一个网页,并且还想知道到底是哪一个登录用户访问了哪一个网页,这对于我们日后有针对性地向他/她推荐信息甚至推送广告都是非常有用的。

nginx缺省的日志格式

  1. 127.0.0.1 - - [20/Jul/2017:22:04:08 +0800] "GET /news/index HTTP/1.1" 200 22262 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.66 Safari/537.36"

在这里,我们看到,虽然用户已经登录,但是日志里没有任何与用户相关的信息,只有ip地址。如果我们想记录用户的id等信息,怎么办呢?

在PHP端输出特殊的header

我们想到,既然用户已登录了,则它肯定有 cookie 或者 session 或者 token 信息,不管是哪种方式,我们的php一定是可以有效地获取到这个用户的信息的。在这里举例我们通过 session 获取到了用户的id信息:

  1. $user_id = Yii::$app->session['user_id'];

  2. if (empty($user_id)) {

  3.    header('X-UID: 0');

  4. } else {

  5.    header('X-UID: ' . $user_id);

  6. }

如果 session 里没有用户id,则说明用户还没有登录,则输出 X-UID:0 (或者也可以干脆什么也不输出)。如果获取到了 session ,说明用户已登录,则我们把他的 user_id 输出给nginx: X-UID:12345 这样的形式。

在这里,你不止可以输出一个信息,你可以输出好几个不同的字段,包括他的姓名、性别、年龄等等都可以。

创建一种新的日志格式

log_format 只能被存储在 http 段里,所以我们需要找到 nginx.conf 文件。

nginx 缺省的日志格式第二部分就是用户信息,但通常什么也没有,只是一个 - ,这里我们它改造成我们从后端传进来的 header 信息。由上文我们创造的特殊 header X-UID ,这里需要先做一个小的转换, 把大写字母全部改为小写,把所有的-改为下划线 ,就变成了 x_uid ,然后在前面拼接上 $upstream_http_ ,就得到了最终的结果 $upstream_http_x_uid ,然后把它插入到日志格式任何你想让它出现的地方:

  1. log_format front '$remote_addr - $upstream_http_x_uid [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';

在server里引用这种日志格式

server 相关的设置里,因为我们上面给日志格式起名为 front ,所以在这里我们引用它时,需要指明用 front 日志格式:

  1. access_log /var/log/nginx/front-access.log front;

新的日志结果

  1. 127.0.0.1 - 52248 [20/Jul/2017:22:35:40 +0800] "GET /news/view?id=56 HTTP/1.1"







请到「今天看啥」查看全文