一、背景
由于前端项目是静态文件,是在浏览器端运行,如果要打日志到服务器,无法直接通过某些工具完成。只有那些运行在服务器端的程序,如后台程序,才能直接的在服务器端打印日志。但是我们必须要记录下前端页面的操作轨迹,就必须另辟蹊径了。
二、探索结果
1.从apache的日志入手
通过查阅资料,发现apache服务器或者nginx服务器都能够记录前端发送到服务器的请求。并能记录请求的url连接,请求时间,客户端浏览器等信息。
2.通过请求的URL记录日志
所以,我们可以通过前端请求的url来记录日志。将日志写在url中,对这种无效的日志url前端进行特殊处理,异步调用,不会影响前端页面的使用。后台apache接受到请求后,将对应的日志url按照自己的规范进行解析,提取日志信息。我们可以对特定url的连接进行日志过滤,将日志请求单独存放
优点:原理简单,只需要配置普通的apache 日志配置即可。
缺点:
- 记录的日志如果包含敏感信息,发送的请求在前端浏览器能被随意查看,可能存在安全问题
- 由于传递的最终也是个字符串,对url的书写规范要求严格,定义复杂,解析繁琐,且容易出错
3.进一步探索能否通过获取POST请求的参数,来传递日志
上面的传统日志记录方式,虽然能获取到get post请求,但是缺获取不到请求体中的内容。如果需要获取请求体body中的内容,则需要使用apache的另一个模块mod_dumpio
。
(1) 配置mod_dumpio
首先校验dumpio模块是否存在
# httpd -M | grep 'dumpio'
dumpio_module (shared)
出现结果表示存在该模块
其次配置dumpio。
在httpd.conf
配置文件中找到如下行:
# LoadModule dumpio_module modules/mod_dumpio.so
去掉前面的#
然后在该文件中添加如下配置:
LogLevel dumpio:trace7
<IfModule dumpio_module>
DumpIOInput On
</IfModule>
(2) 配置完成,重启apache
(3)日志打印结果
访问服务器:
curl -X POST -d '{"key": "value"}' 'http://10.221.157.129:8480/xxx'
在error.log里查看打印的日志如下:
[Wed Sep 02 10:18:49.075317 2020] [dumpio:trace7] [pid 50622:tid 139724777260800] mod_dumpio.c(103): [client 172.26.3.88:41748] mod_dumpio: dumpio_in (data-HEAP): {"key": "value"}
这样就可通过json格式获取日志
**优点:**定义规范方便,不容易出错,格式简洁明了。
缺点:日志量较大,且日志较混乱,且都在error_log中可能会干扰,影响查找。同样存在日志敏感信息安全问题