AWStats 日誌解析 - 自定義 Nginx 日誌格式
我已安裝 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 配置中使用。