Nginx 日志记录post数据,并使用goaccess进行日志分析

nginx日志默认不会记录post数据

在nginx配置文件的http节

log_format 日志格式标识 [escape=json] 日志格式

比如:日志格式标识设置为main,添加escape=json以便中文正确显示(注意,escape=json 需要 nginx 1.11.8 以上版本才支持),记录post和cookie的请求的相信信息

log_format main escape=json ‘$remote_addr [$time_local] "$request" $status $bytes_sent "$http_referer" "$http_user_agent" "$http_cookie" "$request_body"‘;

其中:

$time_local 格式化的时间
$request 请求地址
$status 响应码
$body_bytes_sent 传送页面的字节数
$http_referer 来源地址
$http_user_agent 客户端UA
$document_root 当前文件的目录绝对地址,比如:/var/www/html
$fastcgi_script_name 当前url的绝对地址,比如:/info.php
$request_filename 当前请求文件的绝对物理地址,基于root和alias指令,比如:/var/www/html/info.php
$http_cookie cookie信息,这个也很重要,如果在cookie中带上了用户的标识,比较方便调试

然后在每个虚拟站点的server节

access_log  日志报错路径 日志格式标识;

比如日志保存到/data/logs/web.log,日志格式用刚才设置的main那个格式,如果要其他格式可以在刚才的http节添加多个log_format,并使用不同的日志格式标识

access_log  /data/logs/web.log main;

GoAccess日志分析

安装

yum install glib2 glib2-devel GeoIP-devel  ncurses-devel zlib zlib-develyum install gcc -y
yum -y install GeoIP-update
yum install goaccess

查看nginx的日志格式配置,用 nginx2goaccess.sh 将 nginx日志格式配置转换为goaccess可以识别的格式配置

https://raw.githubusercontent.com/stockrt/nginx2goaccess/master/nginx2goaccess.sh

sh nginx2goaccess.sh ‘<log_format>‘       #log_format为你nginx.conf中配置的日志格式

比如:

sh nginx2goaccess.sh ‘$remote_addr [$time_local] "$request" $status $bytes_sent "$http_referer" "$http_user_agent" "$http_cookie" "$request_body"‘

转换的结果是

- Generated goaccess config:
time-format %T
date-format %d/%b/%Y
log_format %h [%d:%t %^] "%r" %s %b "%R" "%u" "%^" "%r_body"

把结果保存为go.conf文件

然后就可以对nginx日志进行分析了

./goaccess -f nginx_access.log -p go.conf -o report.html

发现报错

Token already set for ‘%r‘ specifier.,那个因为%r_body不被支持,替换为

log_format %h [%d:%t %^] "%r" %s %b "%R" "%u" "%^" "%^"

如果要对日志进行实时分析

nohup ./goaccess -f nginx_access.log -p go.conf -o report.html --real-time-html --ws-url=report.xxx.com &

goaccess命令参数:

-a --agent-list 启用由主机用户代理的列表。为了更快的解析,不启用该项
-d --with-output-resolver 在HTML/JSON输出中开启IP解析,会使用GeoIP来进行IP解析
-f --log-file 需要分析的日志文件路径
-p --config-file 配置文件路径
-o --output 输出格式,支持html、json、csv
-m --with-mouse 控制面板支持鼠标点击
-q --no-query-string 忽略请求的参数部分
--real-time-html 实时生成HTML报告
--daemonize 守护进程模式,--real-time-html时使用

goaccess日期时间格式:

%a 星期几的简写
%A 星期几的全称
%b 月份的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的前两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年份,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从1到7,星期一为1)
%U 第年的第几周,把星期日作为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

goaccess 格式标识:

%t  匹配time-format格式的时间字段
%d  匹配date-format格式的日期字段
%h  host(客户端ip地址,包括ipv4和ipv6)
%r  来自客户端的请求行
%m  请求的方法
%U  URL路径
%H  请求协议
%s  服务器响应的状态码
%b  服务器返回的内容大小
%R  HTTP请求头的referer字段
%u  用户代理的HTTP请求报头
%D  请求所花费的时间,单位微秒
%T  请求所花费的时间,单位秒
%^  忽略这一字段

如果nginx2goaccess转换的格式使用时会报错,请自行按以上格式标识编写

为了设置正确的log format,踩了不少坑,先列出来避免大家重复碰到。
(1) log format默认是按照空格分隔日志信息的,所以,对于包含了特殊字符如空格等信息的字段,必须包含在“”里面。如字段request http_user_agent等
(2) nginx日志格式里面,采用空格分隔,但是此处一定注意,只能用一个空格。当时我有个地方用了两个空格,直接导致goaccess结果出错。
(3) nginx日志中的每一个字段都要和log format中的一一对应,如果log format中不需要nginx中的某一个信息,则用%^跳过该信息。
(4) 对于nginx日志中的每一个 -, log format都需要一个%^来跳过, 如果是“-”, 则用“%^”
(5) 如果nginx日志信息中有:, 则需要在log format中也显示出来。例如nginx日志中$time_local就包含了:,所以在log format的相应位置也是 [%d:%t %^]

原文地址:https://www.cnblogs.com/lbnnbs/p/12038327.html

时间: 2024-09-30 08:22:28

Nginx 日志记录post数据,并使用goaccess进行日志分析的相关文章

(转)解释一下SQLSERVER事务日志记录

本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/07/16/3194220.html 解释一下SQLSERVER事务日志记录 大家知道在完整恢复模式下,SQLSERVER会记录每个事务所做的操作,这些记录会存储在事务日志里,有些软件会利用事务日志来读取 操作记录恢复数据,例如:log explorer 那么事务日志记录怎麽查看,里面都记录了些什么? 打开可以利用下面SQL语句来查看所在数据库的事务日志记录 1 USE [GPOSDB] -

导数中的最小化日志记录:背景和理论

什么是最小化日志(Minimal Logging) 当数据库的恢复模式为SIMPLE或者BULK_LOGGED时,对于最小化日志类型的操作,事务日志不记录单独每个数据行的日志,而是记录对应页和区结构的修改日志.这样显著减少了操作产生的事务日志数量.例如,向某个数据页上插入200行数据,在最小化日志记录的情况下,只会记录一条此数据页变化的日志,而不是200条Insert日志. 最小化日志类型的操作 SELECT INTO Bulk导数操作,包括 BULK INSERT和BCP INSERT INT

第十一篇 Integration Services:日志记录

本篇文章是Integration Services系列的第十一篇,详细内容请参考原文. 简介在前一篇,我们讨论了事件行为.我们分享了操纵事件冒泡默认行为的方法,介绍了父子模式.在这一篇,我们会配置SSIS内置日志记录.我们会演示简单和高级日志配置,保存和查看日志配置,生成自定义日志消息.SSIS任务事件打开Precedence.dtsx包.你的控制流面板应该如图11.1所示:图11.1在第九篇和第十篇,我们关注在序列容器1.我们在Script Task 4和序列容器1上创建了OnError事件处

IIS 7完全攻略之日志记录配置(摘自网络)

IIS 7完全攻略之日志记录配置 作者:泉之源 [IT168 专稿]除了 Windows 提供的日志记录功能外,IIS 7.0 还可以提供其他日志记录功能.例如,可以选择日志文件格式并指定要记录的请求. (一)启用或禁用日志记录 如果希望 IIS 基于配置的条件有选择地记录特定的服务器请求,就应为服务器启用日志记录.一旦启用了服务器日志记录,就可以为服务器上的任意站点启用选择性日志记录.然后,还可以查看日志文件,以了解失败和成功的请求. 如果不再希望 IIS 有选择地记录对某个站点的请求,则应为

Elmah 日志记录组件

[http://www.cnblogs.com/chenkai/archive/2013/01/26/2877855.html] 常在服务器端处理用户请求时.特别是针对Web应用程序.当出现异常是可以根据日志操作记录还原异常出现时操作步骤.而记录异常堆栈信息判断问题出现问题位置. 为了跟踪和记录服务器行为.特别是针对出现异常时构建简单.统一的异常处理模式就显得尤为重要. 如果有一个基础的架构用来记录服务器端中日志和事件.那么对于调试和在问题的解决就变得更加简单直接.针对日志记录.可能针对大部分开

go-gin-api 路由中间件 - 日志记录

概述 首先同步下项目概况: 上篇文章分享了,规划项目目录和参数验证,其中参数验证使用的是 validator.v8 版本,现已更新到 validator.v9 版本,最新代码查看 github 即可. 这篇文章咱们分享:路由中间件 - 日志记录. 日志是特别重要的一个东西,方便我们对问题进行排查,这篇文章我们实现将日志记录到文本文件中. 这是我规划的,需要记录的参数: - request 请求数据 - request_time - request_method - request_uri - r

Servlet过滤器——日志记录过滤器

1.概述 在实际的项目开发过程中,经常需要在项目运行时,记录并在控制台中输出运行时的日志信息,便于查看项目的运行状况.本实例将介绍如何应用过滤器实现日志记录.运行本实例,将在控制台中输出项目运行时的日志信息. 2.技术要点 本实例主要应用Apache的Log4j组件输出日志信息.该组件主要用于日志管理.Logger是Log4j的日志记录器,它是Log4j的核心组件. 在程序中可以使用Logger类的不同方法来输出各种级别的日志信息,Log4j会根据配置的当前日志级别决定输出哪些日志.对应各种级别

巧用Logcat把日志记录到文件

在一些开发阶段,产品已经小部分分发出去,在出现问题的时候,我们希望用户能把当时的Logcat日志也发过来提供给程序员进行分析,这里介绍一个巧妙利用logcat命令行进行日志记录的方法,不用自己写日志记录的代码. Android的shell里面提供个logcat的命令,是用来查看系统日志的,这个命令同时支持日志过滤.日志记录到文件,并支持自动日志文件滚动.控制日志文件大小.因此,我们在系统启动的时候,用Runtime调用一下logcat命令,启动一个进程,就可以把我们通过Logcat发的日志记录到

日志记录.02_线程处理

为了在业务系统中方便记录日志,可以建立一个线程类,专用于记录日志 Type TCustomLogThread = class(TThread) 为了保证线程记录日志的有效性和安全性,在线程中可以添加一个临界区来进行保护,当高频记录日志时,可有效的保护日志记录安全 Var FCS:TRTLCriticalSection;     --WinApi.Windows.pas --创建 --释放 InitializeCriticalSection(FCS);              DeleteCri