Skip to content

ngocquang/logging_system

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tạo một hệ thống Logging cho nhiều dự án/server

PS: Bài viết góp nhặt từ kinh nghiệm và học hỏi từ các chuyên gia

Chào các bạn !

Cái gì cũng vậy, đều đến từ nhu cầu thực tế, nhu cầu của mình là cần có 1 nơi lưu lại các Log của những webApp/website/server mình đang quản lý và hiển thị báo cáo thành Dashboard cho dễ nhìn.

Ở đây còn mang ý nghĩa là đo lường hiệu năng của các script chạy trên đó như là tốt độ load/lỗi tự nhiên xuất hiện, hoặc tốc độ từng câu SQL, cái này hay gặp mới lên Production thì chạy nhanh, cỡ 6 tháng sau thì cả hệ thống như con rùa là do SQL :p

Đặc biệt mấy cái lỗi này thì không có ai báo bạn biết đâu à, mấy tháng sau mới phát hiện thì căng quá.

Mình cũng đã thử khá nhiều dịch vụ quốc tế như loggly.com, logentries.com,... túm lại là chưa tới đâu, phần là vì chi phí, phần là không đúng nhu cầu.

Cuối cùng sao ? thì theo dõi log bằng cơm o.O xài mấy dịch vụ theo dõi server sống hay chết,...

Cho đến 1 ngày, idol của mình là bạn Võ Duy Tuấn, làm 1 buổi meetup về Xây dựng hệ thống Log cho Microservices

Đúng bài luôn :D đi xin source mãi mà ảnh không cho, nên đành chịu, tự xem theo cấu trúc hệ thống mà tự dựng vậy Y_Y

Làm xong rồi, chạy rồi, nên mình mới viết bài này, vừa lưu lại, vừa ôn bài, vừa share cho anh em đồng đạo nếu có nhu cầu tương tự.

Mô tả cấu trúc hệ thống (hình của anh Tuấn)

Cấu trúc hệ thống Log

Thứ tự việc cần làm

  1. Log hệ thống bằng NodeQuery.com
  2. Tạo server chứa và nhận Log
  3. Cài đặt RabbitMQ
  4. Cài đặt ClickHouse
  5. Cài UDP Log Server
  6. Cài UDP Log Worker
  7. Cài Supervisor
  8. Cài syslog-ng và gởi log remote
  9. App Log và PHP Error
  10. Cronjob Retention Log
  11. Grafana vẽ Dashboard
  12. Đoạn kết

Log hệ thống bằng NodeQuery

NodeQuery.com

Ok đăng ký 30s, gõ lệnh 5s, là bạn đã có 1 hệ thống theo dõi Ram, HDD, CPU cho server của mình.

Free 10 server và có cả tính năng Alert qua e-mail

Tool quá xịn, mong chờ bấy lâu :D đặc biệt vụ hết HDD là hay gặp ở server Cloud

Tạo server chứa và nhận Log

Mình chọn Digital Ocean giá hạt dẻ 5$/tháng RAM 1 GB, 1 vCPU, 1 TB traffic, 25 GB SSD

Cách dễ là chọn Image Ubuntu LAMP 18.04 là xong. Hoặc thuần Ubnuntu 18.04 rồi cài thêm PHP.

Cài đặt RabbitMQ

Mình để sẵn các command line hoặc xem link

Cài Erlang xem link

Cài RabbitMQ

wget -O- https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc | sudo apt-key add -

wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -

echo "deb https://dl.bintray.com/rabbitmq/debian $(lsb_release -sc) main" | sudo tee /etc/apt/sources.list.d/rabbitmq.list

sudo apt update

sudo apt -y install rabbitmq-server

sudo systemctl status rabbitmq-server.service

systemctl is-enabled rabbitmq-server.service

Kiểm tra ok chưa

sudo rabbitmqctl status

Bật chế độ xem giao diện quản lý RabbitMQ bằng web browser

sudo rabbitmq-plugins enable rabbitmq_management

sudo chown -R rabbitmq:rabbitmq /var/lib/rabbitmq/

Tạo tài khoản vào RabbitMQ (default là guest / guest)

XXXpasswordXXX là mật khẩu của admin

sudo rabbitmqctl add_user admin XXXpasswordXXX

sudo rabbitmqctl set_user_tags admin administrator

sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

Tạo user log, dùng để UDP Worker lấy log về Database

sudo rabbitmqctl add_user log XXXpasswordXXX

sudo rabbitmqctl set_user_tags log administrator

sudo rabbitmqctl set_permissions -p / log ".*" ".*" ".*"

sudo ufw allow proto tcp from any to any port 5672,15672

Done rồi

Giờ truy cập vào địa chỉ http://[IP Log server]:15672/

Nếu thấy hình này thì là ok nha. Không thì xem lại link tài liệu ở trên.

RabbitMQ

Cách sử dụng thì các bạn xem tài liệu của RabbitMQ tại đây

Cài đặt ClickHouse

Theo anh Tuấn giới thiệu thì Database ClickHouse query xử lý tính bằng trăm triệu records. Hoạt động trên cơ chế column-oriented thay vì row-oriented như MySQL, xem thêm sự khác nhau ở đây

Xem thêm hướng dẫn cài đặt ở đây

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4

echo "deb http://repo.yandex.ru/clickhouse/deb/stable/ main/" | sudo tee /etc/apt/sources.list.d/clickhouse.list

sudo apt-get update

sudo apt-get install -y clickhouse-server clickhouse-client

sudo service clickhouse-server start

sudo service clickhouse-server status

sudo ufw allow proto tcp from any to any port 8123,9000

Mình dùng App DBeaver để kết nối vào ClickHouse

Schema để trong thư mục clickhouse (anh Tuấn share)

Chi tiết cách query, select/insert/update/delete thì các bạn đọc tài liệu ClickHouse nhé.

Cài UDP Log Server

Trước tiên xác định là mình sử dụng PHP command line để tạo 1 UDP server, nhớ giấu IP server Log này hoặc bạn tự tìm hiểu thêm cách bảo vệ nhé.

Sử dụng extension Swoole

pecl install swoole

touch /etc/php/7.2/cli/conf.d/swoole.ini && echo 'extension=swoole.so' > /etc/php/7.2/cli/conf.d/swoole.ini

Kiểm tra

php -m | grep swoole

Source code server UDP có ở thư mục php nhé. Bạn đưa lên server ví dụ /var/www cũng được

Chạy command line sau ở thư mục php

composer install

sudo ufw allow proto udp from any to any port 9502,9501

Chạy thử

php /var/www/udp_server.php

Cập nhật file config.php File này chứa các thông số như IP, port, username, password của RabbitMQ và ClickHouse Bạn cần cập nhật đầy đủ, chú ý coi chừng nhầm giữa port 15672 dành cho RabittMQ web management và 5672 dành cho file config để kết nối TCP, trong file config default là 5672

Cài UDP Log Worker

Cái này chỉ là 1 script PHP dùng để đọc dữ liệu trong queue trong RabbitMQ và insert vào database ClickHouse

Các bạn chú ý trong file này có chia ra 3 loại log (còn thiếu SQL chưa viết xong :p) tương ứng đưa vào 3 table khác nhau.

  • Log từ App (file app.log)
  • Log từ PHP Error (Warning, Fatal Error,...)
  • Log từ syslog khác

Worker và UDP Server đều chạy thường trực.

Chạy thử

php /var/www/udp_worker.php

Để kiểm tra hoặc giữ cho script luôn chạy thì mình dùng Supervisor

Cài Supervisor

Link cài đặt

sudo apt-get install supervisor

Copy 2 file udp_server.conf và udp_worker.conf vào thư mục /etc/supervisor/conf.d/

sudo service supervisor restart

Nếu bạn có nhu cầu để xem trên Browser làm cái này Supervisor Copy file supervisor/http_server.conf vào thư mục /etc/supervisor/conf.d/

sudo ufw allow proto tcp from any to any port 9001

Cài syslog-ng và gởi log remote trên server dự án

Cài đặt syslog-ng và cấu hình để gởi log đến server UDP của mình. Lưu ý chỗ này là server dự án chứ không phải server log

sudo apt-get install syslog-ng -y

Điền IP Server UDP vào chỗ IP_UDP_LOG_SERVER trong file syslog-ng/remote_host.conf

Trong file này, bạn sẽ thấy mình lấy access.log, error.log và app.log Trong đó access.log và error.log là của Apache tạo, còn app.log là do web application của bạn tạo.

Copy file remote_host.conf vào /etc/syslog-ng/conf.d/

service syslog-ng restart

Chỗ này mình gặp 1 vấn đề là PHP không tạo được file log trong /var/log/apache2, vì vậy mình cần để log của app ở nơi khác, chỗ mà user www-data truy cập được.

mkdir /var/www/log

chown www-data:www-data /var/www/log

nano /etc/logrotate.d/my-app

Copy nội dung file logrotate/myapp

Ý nghĩa việc này là cấp quyền user www-data được đọc file log và có chế độ rotate log

App Log và PHP Error

Đây là log chủ động, tức là log do Application của bạn tạo ra. Ở đây mình dùng Monolog và tạo ra file app.log

Format template của Log do bạn quy định, sau đó ở UDP Worker bạn explode() để lấy các thông số mình cần.

Bạn hãy xem file test_app_log.php để thấy cách mình làm.

Ở file này sẽ log lại thời gian bắt đầu/kết thúc của script, kèm memory.

Format Template dạng:

[2020-01-15T15:05:54.681827+07:00] APP-v1.0.INFO: [START2020-01-15 2020-01-15_08:05:54 08 05 APP-v1.0 index.php GET success 0.075027942657471 6291456 118.69.76.177END] [] []

Về PHP Error, thì Apache sẽ báo lỗi 500, và sẽ lưu log về error.log

Trong file udp_worker.php có phần detect PHP Error log để đưa vào bảng log_php_error.

Sau đó chúng ta bắt đầu vẽ Dashboard bằng cách kết nối vào ClickHouse và query các Chart mình cần.

Cronjob Retention Log

Cập nhật Crontjob 1 tháng chạy 1 lần để tiến hành xóa Log theo định kỳ. Ở đây, data log lưu trong Clickhouse đang được chia theo Partition YYYYMM nên chúng ta sẽ xóa Partition của tháng trước

sudo crontab -e

Dán nội dung

0 0 1 * * php /var/www/html/retention_log.php

Grafana vẽ Dashboard

Tuấn có đề cập đến việc sử dụng tự dev ReactJS, hoặc dùng Grafana, Jaeger UI

Trong bài này, mình chỉ đề cập đến Grafana.com

Install Grafana, bạn có thể install trên server khác và kết nối vào ClickHouse

sudo apt-get install -y apt-transport-https

sudo apt-get install -y software-properties-common wget

wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"

sudo apt-get update

sudo apt-get install grafana

Start Grafana Server

sudo systemctl daemon-reload

sudo systemctl start grafana-server

sudo systemctl status grafana-server

Mở port firewall

sudo ufw allow proto tcp from any to any port 3000

Truy cập http://[IP_LOG_SERVER]:3000

Username mặc định là admin / admin, sẽ có yêu cầu đổi khi bạn đăng nhập vào.

Cách sử dụng Grafana thì bạn xem trên website Grafana.com

Hình demo của Tuấn Grafana

Ghi chú: Vì ghi log của rất nhiều server khác nhau, vì vậy trong Grafana có tính năng Variable dùng để filter theo tên Application khá tốt.

Đoạn kết

Trên đây là các kinh nghiệm đã làm qua, hy vọng sẽ giúp ích với các bạn có nhu cầu.

Theo như idol Tuấn đề cập, thì bạn ấy cũng đã thử nhiều cách khác nhau mới chọn ra được cách này, mang lại sự ổn định nhất cho đến hiện tại. Số log lưu lại tính bằng trăm triệu records mà hệ thống vẫn chạy ổn định, kể cả server Log.

About

Hướng dẫn tạo một hệ thống Log Remote dùng chung cho nhiều dự án/server

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages