Thứ hai, 01/06/2015 | 00:00 GMT+7

Xây dựng cho sản xuất: Ứng dụng web - Ghi log tập trung

Cuối cùng, ta đã sẵn sàng cài đặt ghi log tập trung cho cài đặt ứng dụng production của bạn . Ghi log tập trung là một cách tốt để thu thập và trực quan hóa log của các server của bạn. Nói chung, việc cài đặt một hệ thống ghi log phức tạp không quan trọng bằng việc cài đặt các bản backup và giám sát vững chắc, nhưng nó có thể rất hữu ích khi cố gắng xác định xu hướng hoặc vấn đề với ứng dụng của bạn.

Sơ đồ ghi log  tập trung

Trong hướng dẫn này, ta sẽ cài đặt ngăn xếp ELK (Elasticsearch, Logstash và Kibana) và cấu hình các server bao gồm ứng dụng của ta để gửi các log liên quan của chúng đến server ghi log . Ta cũng sẽ cài đặt các bộ lọc Logstash sẽ phân tích cú pháp và cấu trúc log của ta , cho phép ta dễ dàng tìm kiếm và lọc chúng cũng như sử dụng chúng trong hình ảnh hóa Kibana.

Yêu cầu

Nếu bạn muốn truy cập trang tổng quan ghi log của bạn qua domain , hãy tạo Bản ghi A trong domain của bạn, như “logging.example.com”, trỏ đến địa chỉ IP công khai của server ghi log của bạn. Ngoài ra, bạn có thể truy cập trang tổng quan giám sát qua địa chỉ IP công cộng. Bạn nên cài đặt web server ghi log để sử dụng HTTPS và hạn chế quyền truy cập vào nó bằng cách đặt nó sau VPN.

Cài đặt ELK trên Server ghi log

Cài đặt ELK trên server ghi log của bạn theo hướng dẫn này: Cách cài đặt Elasticsearch, Logstash và Kibana 4 trên Ubuntu 14.04 .

Nếu bạn đang sử dụng DNS riêng để phân giải tên, hãy đảm bảo làm theo Tùy chọn 2 trong phần Tạo certificate SSL .

Dừng lại khi bạn đến phần Cài đặt Logstash Forwarder .

Cài đặt Logstash Forwarder cho khách hàng

Cài đặt Logstash Forwarder, người gửi log , trên server khách hàng của bạn, tức là db1, app1, app2 và lb1, theo phần Cài đặt Logstash Forwarder , của hướng dẫn ELK.

Khi hoàn tất, bạn có thể đăng nhập vào Kibana thông qua địa chỉ mạng công cộng của server ghi log và xem nhật ký hệ thống của từng server của bạn.

Xác định log để thu thập

Tùy thuộc vào ứng dụng và cài đặt chính xác của bạn, các bản ghi khác nhau sẽ có sẵn để được thu thập vào ngăn xếp ELK của bạn. Trong trường hợp của ta , ta sẽ thu thập các bản ghi sau:

  • Nhật ký truy vấn chậm MySQL (db1)
  • Nhật ký lỗi và truy cập Apache (app1 và app2)
  • Nhật ký HAProxy (lb1)

Ta chọn những log này vì chúng có thể cung cấp một số thông tin hữu ích khi khắc phục sự cố hoặc cố gắng xác định xu hướng. Server của bạn có thể có các log khác mà bạn muốn thu thập, nhưng điều này sẽ giúp bạn bắt đầu.

Cài đặt log MySQL

Nhật ký truy vấn chậm của MySQL thường được đặt tại /var/log/mysql/mysql-slow . Nó bao gồm các log chạy đủ lâu để được coi là "truy vấn chậm", vì vậy việc xác định các truy vấn này có thể giúp bạn tối ưu hóa hoặc khắc phục sự cố ứng dụng của bạn .

Bật log truy vấn chậm MySQL

Nhật ký truy vấn chậm không được bật theo mặc định, vì vậy hãy cấu hình MySQL để ghi các loại truy vấn này.

Mở file cấu hình MySQL của bạn:

  • sudo vi /etc/mysql/my.cnf

Tìm dòng "ghi lại các truy vấn chậm " đã comment và bỏ ghi chú để nó trông giống như sau:

/etc/mysql/my.cnf
log_slow_queries        = /var/log/mysql/mysql-slow.log 

Lưu và thoát.

Ta cần khởi động lại MySQL để thay đổi có hiệu lực:

  • sudo service mysql restart

Bây giờ MySQL sẽ ghi các truy vấn đang chạy dài của nó vào file log được chỉ định trong cấu hình.

Gửi file log MySQL

Ta phải cấu hình Logstash Forwarder để gửi log truy vấn chậm MySQL đến server ghi log của ta .

Trên server database của bạn, db1, hãy mở file cấu hình Logstash Forwarder:

  • sudo vi /etc/logstash-forwarder.conf

Thêm phần sau, trong phần “tệp” dưới các mục hiện có, để gửi log truy vấn chậm MySQL dưới dạng loại “mysql-slow” đến server Logstash của bạn:

logstash-forwarder.conf - Truy vấn chậm MySQL
,     {       "paths": [         "/var/log/mysql/mysql-slow.log"        ],       "fields": { "type": "mysql-slow" }     } 

Lưu và thoát. Điều này cấu hình Logstash Forwarder để gửi log truy vấn chậm MySQL và đánh dấu chúng là log loại “mysql-slow”, sẽ được sử dụng để lọc sau này.

Khởi động lại Logstash Forwarder để bắt đầu gửi log :

  • sudo service logstash-forwarder restart

Bộ giải mã đầu vào đa dòng

Nhật ký truy vấn chậm MySQL có định dạng đa dòng (tức là mỗi mục nhập kéo dài nhiều dòng), vì vậy ta phải bật codec đa dòng của Logstash để có thể xử lý loại log này.

Trên server ELK, ghi log , hãy mở file cấu hình nơi đầu vào Lumberjack của bạn được xác định:

  • sudo vi /etc/logstash/conf.d/01-lumberjack-input.conf

Trong định nghĩa đầu vào lumberjack , hãy thêm các dòng sau:

    codec => multiline {       pattern => "^# User@Host:"       negate => true       what => previous     } 

Lưu và thoát. Điều này cấu hình Logstash để sử dụng bộ xử lý log đa dòng khi nó gặp các log có chứa mẫu được chỉ định (tức là bắt đầu bằng “# User @ Server :”).

Tiếp theo, ta sẽ cài đặt bộ lọc Logstash cho các bản ghi MySQL.

Bộ lọc log MySQL

Trên server ELK, ghi log , mở một file mới để thêm bộ lọc log MySQL của ta vào Logstash. Ta sẽ đặt tên nó là 11-mysql.conf , vì vậy nó sẽ được đọc sau cấu hình đầu vào Logstash (trong file 01-lumberjack-input.conf ):

  • sudo vi /etc/logstash/conf.d/11-mysql.conf

Thêm định nghĩa bộ lọc sau:

11-mysql.conf
filter {   # Capture user, optional host and optional ip fields   # sample log file lines:   if [type] == "mysql-slow" {     grok {       match => [ "message", "^# User@Host: %{USER:user}(?:\[[^\]]+\])?\s+@\s+%{HOST:host}?\s+\[%{IP:ip}?\]" ]     }     # Capture query time, lock time, rows returned and rows examined     grok {       match => [ "message", "^# Query_time: %{NUMBER:duration:float}\s+Lock_time: %{NUMBER:lock_wait:float} Rows_sent: %{NUMBER:results:int} \s*Rows_examined: %{NUMBER:scanned:int}"]     }     # Capture the time the query happened     grok {       match => [ "message", "^SET timestamp=%{NUMBER:timestamp};" ]     }     # Extract the time based on the time of the query and not the time the item got logged     date {       match => [ "timestamp", "UNIX" ]     }     # Drop the captured timestamp field since it has been moved to the time of the event     mutate {       remove_field => "timestamp"     }   } } 

Lưu và thoát. Điều này cấu hình Logstash để lọc các bản ghi kiểu mysql-slow với các mẫu Grok được chỉ định trong chỉ thị match . Nhật ký loại apache-access đang được phân tích cú pháp bởi mẫu Grok do Logstash cung cấp phù hợp với định dạng thông báo log Apache mặc định, trong khi các log loại apache-error đang được phân tích cú pháp bởi bộ lọc Grok được viết để trùng với định dạng log lỗi mặc định.

Để các bộ lọc này hoạt động, hãy khởi động lại Logstash:

  • sudo service logstash restart

Đến đây, bạn cần đảm bảo Logstash đang chạy đúng cách, vì các lỗi cấu hình sẽ khiến nó không thành công.

Trang tổng quan Kibana

Bạn cũng cần xác nhận Kibana có thể xem các log Apache đã lọc.

Nhật ký Apache

Nhật ký của Apache thường nằm trong /var/log/apache2 , có tên là “access.log” và “error.log”. Thu thập các log này sẽ cho phép bạn xem địa chỉ IP của ai đang truy cập server của bạn, những gì họ đang yêu cầu, hệ điều hành và trình duyệt web nào họ đang sử dụng, ngoài bất kỳ thông báo lỗi nào mà Apache đang báo cáo.

Gửi file log Apache

Ta phải cấu hình Logstash Forwarder để gửi các bản ghi lỗi và truy cập Apache đến server ghi log của ta .

Trên server ứng dụng của bạn, app1 và app2, hãy mở file cấu hình Logstash Forwarder:

  • sudo vi /etc/logstash-forwarder.conf

Thêm phần sau, trong phần “tệp” dưới các mục hiện có, để gửi log Apache, dưới dạng các loại thích hợp, đến server Logstash của bạn:

logstash-forwarder.conf - Nhật ký lỗi và truy cập Apache
,     {       "paths": [         "/var/log/apache2/access.log"        ],       "fields": { "type": "apache-access" }     },     {       "paths": [         "/var/log/apache2/error.log"        ],       "fields": { "type": "apache-error" }     } 

Lưu và thoát. Điều này cấu hình Logstash Forwarder để gửi các bản ghi lỗi và truy cập Apache và đánh dấu chúng là các loại tương ứng, sẽ được sử dụng để lọc các bản ghi.

Khởi động lại Logstash Forwarder để bắt đầu gửi log :

sudo service logstash-forwarder restart 

Ngay bây giờ, tất cả log Apache của bạn sẽ có địa chỉ IP nguồn client trùng với địa chỉ IP riêng của server HAProxy, vì Reverse Proxy HAProxy là cách duy nhất để truy cập server ứng dụng của bạn từ Internet. Để thay đổi điều này nhằm hiển thị IP nguồn của user thực đang truy cập trang web , ta có thể sửa đổi định dạng log Apache mặc định để sử dụng tiêu đề X-Forwarded-For mà HAProxy đang gửi.

Mở file cấu hình Apache của bạn (apache2.conf):

  • sudo vi /etc/apache2/apache2.conf

Tìm dòng trông giống như sau:

[Label apache2.conf — Original "combined" LogFormat] LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 

Thay % h bằng % {X-Forwarded-For} i , vì vậy nó trông giống như sau:

[Label apache2.conf — Updated "combined" LogFormat] LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined 

Lưu và thoát. Điều này cấu hình log truy cập Apache để bao gồm địa chỉ IP nguồn của user thực tế của bạn, thay vì địa chỉ IP riêng của server HAProxy.

Khởi động lại Apache để thay đổi log có hiệu lực:

  • sudo service apache2 restart

Bây giờ ta đã sẵn sàng để thêm bộ lọc log Apache vào Logstash.

Bộ lọc log Apache

Trên server ELK, ghi log , mở một file mới để thêm bộ lọc log Apache của ta vào Logstash. Ta sẽ đặt tên là 12-apache.conf , vì vậy nó sẽ được đọc sau cấu hình đầu vào Logstash (trong file 01-lumberjack-input.conf ):

  • sudo vi /etc/logstash/conf.d/12-apache.conf

Thêm các định nghĩa bộ lọc sau:

12-apache.conf
filter {   if [type] == "apache-access" {     grok {       match => { "message" => "%{COMBINEDAPACHELOG}" }     }   } } filter {   if [type] == "apache-error" {     grok {       match => { "message" => "\[(?<timestamp>%{DAY:day} %{MONTH:month} %{MONTHDAY} %{TIME} %{YEAR})\] \[%{DATA:severity}\] \[pid %{NUMBER:pid}\] \[client %{IPORHOST:clientip}:%{POSINT:clientport}] %{GREEDYDATA:error_message}" }     }   } } 

Lưu và thoát. Điều này cấu hình Logstash để lọc các bản ghi loại apache-accessapache-error với các mẫu Grok được chỉ định trong các chỉ thị match tương ứng. Nhật ký loại apache-access đang được phân tích cú pháp bởi mẫu Grok do Logstash cung cấp phù hợp với định dạng thông báo log Apache mặc định, trong khi các log loại apache-error đang được phân tích cú pháp bởi bộ lọc Grok được viết để trùng với định dạng log lỗi mặc định.

Để các bộ lọc này hoạt động, hãy khởi động lại Logstash:

  • sudo service logstash restart

Đến đây, bạn cần đảm bảo Logstash đang chạy đúng cách, vì các lỗi cấu hình sẽ khiến nó không thành công. Bạn cũng cần xác nhận Kibana có thể xem các log Apache đã lọc.

Nhật ký HAProxy

Nhật ký của HAProxy thường nằm trong /var/log/haproxy.log . Thu thập các log này sẽ cho phép bạn xem địa chỉ IP của ai đang truy cập bộ cân bằng tải của bạn, những gì họ đang yêu cầu, server ứng dụng nào đang phục vụ yêu cầu của họ và nhiều chi tiết khác về kết nối.

Gửi file log HAProxy

Ta phải cấu hình Logstash Forwarder để gửi log HAProxy.

Trên server HAProxy của bạn, lb1 , hãy mở file cấu hình Logstash Forwarder:

sudo vi /etc/logstash-forwarder.conf 

Thêm phần sau, trong phần “tệp” bên dưới các mục hiện có, để gửi log HAProxy dưới dạng “haproxy-log” đến server Logstash của bạn:

logstash-forwarder.conf - Nhật ký HAProxy
,     {       "paths": [         "/var/log/haproxy.log"        ],       "fields": { "type": "haproxy-log" }     } 

Lưu và thoát. Điều này cấu hình Logstash Forwarder để gửi các bản ghi HAProxy và đánh dấu chúng là haproxy-log , sẽ được sử dụng để lọc các bản ghi.

Khởi động lại Logstash Forwarder để bắt đầu gửi log :

sudo service logstash-forwarder restart 

Bộ lọc log HAProxy

Trên server ELK, ghi log , mở một file mới để thêm bộ lọc log HAProxy của ta vào Logstash. Ta sẽ đặt tên nó là 13-haproxy.conf , vì vậy nó sẽ được đọc sau cấu hình đầu vào Logstash (trong file 01-lumberjack-input.conf ):

sudo vi /etc/logstash/conf.d/13-haproxy.conf 

Thêm định nghĩa bộ lọc sau:

filter {   if [type] == "haproxy-log" {     grok {       match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{HOSTNAME:hostname} %{SYSLOGPROG}: %{IPORHOST:clientip}:%{POSINT:clientport} \[%{MONTHDAY}[./-]%{MONTH}[./-]%{YEAR}:%{TIME}\] %{NOTSPACE:frontend_name} %{NOTSPACE:backend_name}/%{NOTSPACE:server_name} %{INT:time_request}/%{INT:time_queue}/%{INT:time_backend_connect}/%{INT:time_backend_response}/%{NOTSPACE:time_duration} %{INT:http_status_code} %{NOTSPACE:bytes_read} %{DATA:captured_request_cookie} %{DATA:captured_response_cookie} %{NOTSPACE:termination_state} %{INT:actconn}/%{INT:feconn}/%{INT:beconn}/%{INT:srvconn}/%{NOTSPACE:retries} %{INT:srv_queue}/%{INT:backend_queue} "(%{WORD:http_verb} %{URIPATHPARAM:http_request} HTTP/%{NUMBER:http_version})|<BADREQ>|(%{WORD:http_verb} (%{URIPROTO:http_proto}://))" }     }   } } 

Lưu và thoát. Điều này cấu hình Logstash để lọc haproxy-log loại haproxy-log với các mẫu Grok được chỉ định trong chỉ thị match tương ứng. haproxy-log loại haproxy-log đang được phân tích cú pháp bởi mẫu Grok do Logstash cung cấp phù hợp với định dạng thông báo log HAProxy mặc định.

Để các bộ lọc này hoạt động, hãy khởi động lại Logstash:

  • sudo service logstash restart

Đến đây, bạn cần đảm bảo Logstash đang chạy đúng cách, vì các lỗi cấu hình sẽ khiến nó không thành công.

Cài đặt hình ảnh Kibana

Đến đây bạn đang thu thập log của bạn ở vị trí trung tâm, bạn có thể bắt đầu sử dụng Kibana để hình dung chúng. Hướng dẫn này có thể giúp bạn bắt đầu với điều đó: Cách sử dụng Trang tổng quan và Hình ảnh hóa Kibana .

Khi bạn đã cảm thấy thoải mái với Kibana, hãy thử hướng dẫn này để hình dung user của bạn theo cách thú vị: Cách lập bản đồ vị trí user với GeoIP và ELK .

Kết luận

Xin chúc mừng! Bạn đã hoàn thành loạt bài hướng dẫn Cài đặt Ứng dụng Web Sản xuất. Nếu bạn đã làm theo tất cả các hướng dẫn, bạn sẽ có một cài đặt giống như những gì ta đã mô tả trong hướng dẫn tổng quan (với DNS riêng và backup từ xa):

 Cài đặt  production

Đó là, bạn nên có một ứng dụng hoạt động, với các thành phần được tách rời, được hỗ trợ bởi các thành phần backup , giám sát và ghi log tập trung. Đảm bảo kiểm tra ứng dụng của bạn và đảm bảo tất cả các thành phần hoạt động như mong đợi.


Tags:

Các tin liên quan

Xây dựng cho Sản xuất: Ứng dụng Web - Tổng quan
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Giám sát
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - backup
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Triển khai
2015-06-01
Xây dựng cho Sản xuất: Ứng dụng Web - Lập kế hoạch khôi phục
2015-06-01
Cách cài đặt control panel lưu trữ web Sentora trên Ubuntu 14.04
2015-04-27
Cách cài đặt web server OpenLiteSpeed trên CentOS 7
2015-04-16
Cách cài đặt web server OpenLiteSpeed trên Ubuntu 14.04
2015-04-15
Cách cài đặt Bacula-Web trên Ubuntu 14.04
2015-04-03
Khái niệm cơ bản về bộ nhớ đệm trên web: Thuật ngữ, Tiêu đề HTTP và Chiến lược lưu vào bộ đệm
2015-04-01