AWStats 日志解析-自定义 Nginx 日志格式

AWStats 日志解析-自定义 Nginx 日志格式

我安装了 AWStats 7.0(Amazon Linux 存储库中的最新版本),试图获取有关带宽使用情况的更多信息。我无法让 AWStats 解析我的日志 - 我怀疑这是因为我无法正确获取 LogFormat。

我尝试过很多变化但就是无法让它发挥作用。

这是我的 Nginx 日志格式

log_format  main  '$remote_addr - $remote_user [$time_local] "$host" "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for" "$request_time" '
                  '"$upstream_cache_status" "$sent_http_content_encoding" ';

以下是日志条目

1.1.1.1 - - [12/Mar/2017:07:23:53 +1300] "www.example.com" "GET /url/ HTTP/1.1" 200 7455 "https://www.google.ru/" "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" "46.71.136.54" "0.000" "HIT" "gzip"

这是我的 AWStats 配置文件。这里没有的内容都是标准的,并且继承自主配置文件

# Path to you nginx vhost log file
LogFile="/var/log/nginx/pts.access.log"

# Domain of your vhost
SiteDomain="example.com"

# Directory where to store the awstats data
DirData="/var/lib/awstats/pts/"

# Other alias, basically other domain/subdomain that's the same as the domain above
HostAliases="www.example.com"

LogFormat = "%host %logname %time1 %virtualname %methodurl %code %bytesd %refererquot %uaquot %otherquot %otherquot %otherquot %otherquot"

这是 awstats 输出

[root]# /usr/share/awstats/tools/awstats_updateall.pl now -awstatsprog=/usr/share/awstats/wwwroot/cgi-bin/awstats.pl
Running '"/usr/share/awstats/wwwroot/cgi-bin/awstats.pl" -update -config=example.com -configdir="/etc/awstats"' to update config example.com
Create/Update database for config "/etc/awstats/awstats.example.com.conf" by AWStats version 7.0 (build 1.971)
From data in log file "/var/log/nginx/pts.access.log"...
Phase 1 : First bypass old records, searching new record...
Searching new records from beginning of log file...
Jumped lines in file: 0
Parsed lines in file: 323
 Found 323 dropped records,
 Found 0 comments,
 Found 0 blank records,
 Found 0 corrupted records,
 Found 0 old records,
 Found 0 new qualified records.

有人能发现哪里不对劲吗?我找不到任何其他信息或可以提供更多信息的 awstats 日志。

答案1

一个可能的问题如下:

log_format  main  '$remote_addr - $remote_user [$time_local]...

AWStats中对应配置:

LogFormat = "%host %logname %time1

您的日志文件包含:

1.1.1.1 - - [12/Mar/2017:07:23:53 +1300]

%logname仅匹配单个字符串,即 HTTP 身份验证中提供的用户名。现在,您的日志文件包含两个破折号,第一个来自您的配置,第二个表示空用户名。

因此,AWStats 尝试将第二个破折号解释为时间戳,这导致它将记录视为失败。

因此,您要么需要将破折号添加到 AWStats 日志格​​式字符串中,要么从 nginx 日志格式中删除破折号。

附注:您不需要在 nginx 日志中引用最后一个参数(,,$request_time),因为它们不能包含空格。$upstream_cache_status$sent_http_content_encoding

%extraX如果您想使用该信息根据这些事实构建报告,您也可以在 AWStats 配置中使用。

答案2

经过大约 6 个小时的努力,我终于解决了这个问题。关键问题是我的 AWStats 站点配置不正确,但我认为我的 Nginx 日志格式或 AWStats 格式字符串也不正确。

这是我的工作 Nginx 日志格式。这是标准的 Nginx 组合日志格式,它映射到 awstats LogFormat=1,加上我想要的三个额外字段

# /etc/nginx/nginx.conf
log_format combined_custom '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" $host $request_time $upstream_cache_status';

当然,我必须让我的服务器使用此配置。这在我的服务器块中。

# /etc/nginx/sites-enabled/example.com.conf
access_log  /var/log/nginx/access.log combined_custom;

这是我的 AWStats 站点配置文件。它使用站点特定值扩展了 /etc/awstats/awstats.conf.local 文件。

请注意,一个问题是我弄错了 SiteDomain - 我省略了域名开头的“www”。我这样做的原因是,我认为“HostAliases”会让我添加 www 子域作为别名,但这不是它的用途。它是为了

此参数[HostAliases]用于分析日志文件中的引用字段,并帮助AWStats 了解引用URL是同一站点的本地URL还是另一个站点的URL。

# /etc/awstats/awstats.example.com.conf
# Path to you nginx vhost log file
LogFile="/var/log/nginx/access.log"

# Domain of your vhost
SiteDomain="www.example.com"

# Directory where to store the awstats data
DirData="/var/lib/awstats/example/"

# Other alias, basically other domain/subdomain that's the same as the domain above
HostAliases="localhost"

# Performance optimisation
DNSLookup=0

# This works with the Nginx combined log format
# LogFormat=1

# This is the equivalent of LogFormat=1
# LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot"

# This adds my custom fields
LogFormat="%host %other %logname %time1 %methodurl %code %bytesd %refererquot %uaquot %virtualname %other %other"

我还没有进一步让 AWStats 工作起来,但一旦我完成了,我就会在这个帖子里更新我发现的任何棘手的问题。

感谢@Tero Kilkanen 提出的解决这个问题的方法 - 即从组合格式开始然后向前推进。

相关内容