我安装了 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 提出的解决这个问题的方法 - 即从组合格式开始然后向前推进。