Nginx

AWStats 日誌解析 - 自定義 Nginx 日誌格式

  • March 16, 2017

我已安裝 AWStats 7.0(Amazon Linux 儲存庫中的最新版本)以嘗試獲取有關頻寬使用情況的更多資訊。我無法讓 AWSStats 解析我的日誌 - 我懷疑這是因為我無法正確獲取 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"

這是我的 AStats 配置文件。此處沒有的任何內容都是標準的,並且從主配置文件繼承

# 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 日誌。

經過大約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 $$用於分析日誌文件中的referer欄位,幫助AWStats知道一個referer 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"

我還沒有進一步讓 AWSStats 工作,但一旦我這樣做了,我會用我覺得棘手的任何東西來更新這篇文章。

感謝@Tero Kilkanen 提供了解決此問題的方法 - 即從組合格式開始並向前推進。

一個可能的問題在這裡:

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

AStats中對應的配置:

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如果您想在基於這些事實的報告中使用該資訊,您也可以在 AStats 配置中使用。

引用自:https://serverfault.com/questions/837703