Hướng dẫn thực hiện cấu hình Log tập trung trên Linux
Tại sao cần phải thực hiện cấu hình log tập trung? Mô hình cũng như các bước cài đặt trên hệ thống như thế nào? Chi tiết sẽ có trong bài viết ngay sau đây!
Log tập trung là quá trình thu thập, lưu trữ và phân tích các log từ nhiều máy chủ khác nhau về một máy chủ trung tâm. Điều này giúp cho việc quản lý và phân tích log trở nên dễ dàng hơn, đặc biệt là đối với các hệ thống có quy mô lớn. Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách cấu hình log tập trung trên Linux.
1. Tại sao lại cần phải log tập trung
Khi người quản trị phải quản lý quá nhiều thiết bị trong một hệ thống thì họ không thể lúc nào cũng phải ssh vào từng máy để kiểm tra log được. Vậy nên log tập trung là giải pháp quản lý log dễ dàng và khoa học. Khi một thiết bị Client bị xóa khỏi hệ thống, ta vẫn có thể xem lại nhật ký hoạt động của máy Client đó mà không bị mất đi. Tuy nhiên việc cấu hình log tập trung yêu cầu kiến thức nâng cao đối với người quản trị, phải am hiểu và biết cách chọn log cần thiết để tránh tốn quá nhiều dung lượng.
Một lợi ích khác của log tập trung đó là khi 1 máy Client trong hệ thống gặp vấn đề bất kỳ như khởi động không lên, lúc này thông qua log server ta có thể biết lỗi ở đâu và tiến hành khắc phục nhanh chóng.
2. Lưu ý trước khi thực hiện cài đặt
Ở phần trước chúng ta đã tìm hiểu chi tiết về Log, Syslog và Rsyslog. Bạn có thể xem lại tại đây.
Log mà Rsyslog có thể thu thập được sẽ phân chia ra làm 2 loại:
- Log thu thập được do các tiến trình hệ thống sinh ra. Ví dụ như kernel hay auth …
- Log thu thập được do các ứng dụng tải về sinh ra. Ví dụ như apache hay nginx
Để có thể cấu hình log tập trung ta cần phải hiểu về các module hỗ trợ thu thập log và làm cách nào để gọi module đó ra và cấu trúc khai báo nó như thế nào. Trong phần hướng dẫn này mình sẽ chỉ các bạn cách dùng module “imfile” và cách sử dụng biến “$template”.
Một số template string tham khảo:
- %msg% : chèn nội dung của log message
- %timestamp% : chèn vào thời gian ghi log
- %hostname% : Chèn vào tên máy chủ gửi log
- %syslogfacility% và %syslogfacility-text% : Chèn mã của dịch vụ sinh log và văn bản tương ứng với cơ sở (facility) của syslog
- %syslogpriority% và %syslogpriority-text% : chèn mã của mức độ cảnh báo sinh ra log và thêm message
- %programname% : Chèn tên chương trình sinh ra log
- %$YEAR%, %$MONTH%, %$DAY%, %$HOUR%, %$MINUTE%, %$SECOND% : chèn các phần riêng lẻ của timestamp
- %fromhost-ip% : chèn IP của máy gửi log
- %uuid% : Chèn uid một cách ngẫu nhiên
3. Mô hình
Phân tích:
- Máy CentOS 8 có IP 192.168.10.22 là máy nhận log và máy Centos 7 có IP 192.168.10.21 là máy gửi log.
- Trên cả 2 máy đều phải mở port 514 và cho phép TCP.
Yêu cầu:
- Phải gửi được tất cả các log do hệ thống sinh ra từ client đến server và phải được đưa vào thư mục có tên lấy theo tên dịch vụ sinh ra log.
- Phải gửi được log do dịch vụ nginx sinh ra đến server và có tên do chúng ta tự chỉnh sửa.
4. Cấu hình gửi log do hệ thống sinh ra
Mặc định trên các hệ thống của Linux đã cài đặt sẵn Rsyslog rồi nên việc của chúng ta là chỉ cần cấu hình và sử dụng thôi.
4.1 Cấu hình trên Client (CentOS 7)
Bạn cần chú ý file cấu hình chính của Rsyslog là file “/etc/rsyslog.conf’ cục kỳ quan trọng nếu muốn thêm cấu hình thì ta chỉ nên thêm file ở thư mục “/etc/rsyslog.d/”.
Thêm file cấu hình mới cho việc gửi log của hệ thống.
vi /etc/rsyslog.d/system.conf |
Thêm vào nội dung sau:
*.* @@192.168.10.22:514 |
Giải thích:
- *.* ám chỉ tất cả các nguồn sinh ra log và tất cả các mức cảnh báo
- @@ ám chỉ giao thức TCP. Nếu là @ thì là giao thức UDP
- 192.168.10.22:514 là địa chỉ IP máy nhận log và port 514
Bật firewall cho phép sử dụng port 514 với giao thức TCP
firewall-cmd --permanent --add-port=514/tcp firewall-cmd --reload |
Tiến hành restart lại dịch vụ Rsyslog
systemctl restart rsyslog |
4.2 Cấu hình trên Server (CentOS 8)
Thêm file cấu hình mới để nhận log gửi về
vi /etc/rsyslog.d/system.conf |
Thêm vào nội dung sau:
$ModLoad imtcp $InputTCPServerRun 514 $template RemoteServer, "/var/log/%fromhost-ip%/%programname%" *.* ?RemoteServer |
Giải thích:
- $ModLoad imtcp: Sử dụng module imtcp để nhận các thông điệp từ Client gửi đến
- $InputTCPServerRun 514: chỉ định port 514 là port trao đổi giữa 2 máy Server và Client
- $template RemoteServer, "/var/log/%fromhost-ip%/%programname%": Định nghĩa template mới có tên RemoteServer và lưu lại các thông điệp với địa chỉ IP và tên chương trình
- *.* ?RemoteServer: Áp dụng template này với tất cả
Bật firewall cho phép sử dụng port 514 với giao thức TCP.
firewall-cmd --permanent --add-port=514/tcp firewall-cmd --reload |
Tiến hành restart lại dịch vụ Rsyslog.
systemctl restart rsyslog |
4.3 Kiểm tra kết quả
Tiến hành di chuyển đến thư mục “/var/log” và dùng lệnh “tree” để xem kết quả
cd /var/log/ tree |
Yêu cầu là các log của máy client gửi đến phải lưu trong thư mục có tên là IP của máy Client và phải phân chia các chương trình sinh ra log ở các file riêng biệt. Và đây là kết quả:
5. Cấu hình gửi log do dịch vụ Nginx sinh ra
Theo mặc định thì Rsyslog không thể tự thu thập được các thông điệp mà các dịch vụ ta cài thêm để sinh ra log. Mà để thập được các thông điệp vào 1 file log cụ thể thi trên file cấu hình của từng dịch vụ ta sẽ phải cấu hình thêm.
Để có thể gửi log của dịch vụ nginx đi ta cần phải sử dụng module imfile để biến file log do dịch vụ đó thành các thông điệp mà Rsyslog có thể hiểu được rồi qua đó gửi đến Server.
Trên máy Centos 7 mình có cấu hình virtual host nên mình muốn gửi nhiều file log của dịch vụ đi.
5.1 Cấu hình trên Client (CentOS 7)
Thêm file cấu hình cho dịch vụ nginx
vi /etc/rsyslog.d/nginx.conf |
Thêm vào nội dung sau:
# gui log cua virtual host 1 $ModLoad imfile $InputFileName /var/log/nginx/access.log $InputFileTag ip.log $InputFileFacility local3 $InputFilePollInterval 10 $InputRunFileMonitor # gui log cua virtual host 2 $InputFileName /var/log/nginx/access-vhost2.com.log $InputFileTag virtual.log $InputFileFacility local3 $InputFilePollInterval 10 $InputRunFileMonitor local3.* @@192.168.10.22:514 |
Giải thích:
- $ModLoad imfile: Sử dụng module imfile
- $InputFileName /var/log/nginx/access.log: Chỉ ra vị trí file log cần chuyển trên máy Client
- $InputFileTag access.log: Đặt tag tên cho file đó. Ở đây là access.log và sang bên máy Server nó sẽ hiểu là tên chương trình
- $InputFileFacility local3: Đặt tên nguồn sinh ra log ở đây có thể lấy local0-7. Sang bên máy Server nó sẽ hiểu nguồn sinh log là local3. Do chỉ có 8 biến local nên mình dùng chung cho dịch vụ Nginx để tiết kiệm mà khi sang server nó sẽ vẫn phân biệt được 2 file dựa vào tag file
- $InputFilePollInterval 10: Cứ 10s đọc file log 1 lần
- $InputRunFileMonitor: Theo dõi sự thay đổi của file log đó
- local3.* @@192.168.10.22:514: Gửi tất cả thông điệp của local3 đến server qua port 514 bằng giao thức TCP. Dòng này ta có thể loại bỏ vì đã cấu hình gửi tất cả ở mục 3 rồi
Do đã bật firewall cho phép port 514 rồi nên ở đây ta không cần bật lại.
Tiến hành restart lại dịch vụ Rsyslog.
systemctl restart rsyslog |
5.2 Cấu hình trên Server (CentOS 8)
Bình thường nếu không cấu hình template sẵn bằng *.* @@192.168.10.22:514 và điều này đã làm ở mục 3 thì ta cần tạo file mới và thêm cấu hình vào.
$ModLoad imtcp $InputTCPServerRun 514 $template RemoteServer, "/var/log/%fromhost-ip%/%programname%" local3.* ?RemoteServer |
5.3 Tiến hành kiểm tra
Do máy mình có cấu hình virtual host nên mình sẽ dùng 2 tab. 1 tab nhập địa chỉ IP và 1 tab nhập tên miền www.thanhquang.com. Nếu các bạn muốn cài cài đặt virtual host có thể tham khảo các bài viết trước trên suncloud.vn.
Đây là kết quả:
Trên Server tiến hành vào thư mục “var/log”, kiểm tra xem đã có file tên “ip.log” và “virtual.log” chưa.
cd /var/log tree |
6. Câu hỏi thường gặp
Tại sao lại sinh ra thư mục 127.0.0.1 trong thư mục /var/log của máy Server?
- Do chúng ta cấu hình *.* ?Remote Server trên máy Server nên nó sẽ tính cả IP loopback của máy Server vào thư mục riêng. Nếu không muốn có thư mục này ta có thể chỉ định rõ tiến trình sinh log như đã hướng dẫn ở phần 4.
Khi nào thì log sẽ được chuyển từ Client đến Server?
- Chỉ khi có sự thay đổi trong file log được chỉ định để chuyển đi thì Rsyslog mới chuyển các thông điệp đó đi.
Các thông điệp có bao giờ tự tạo thêm file log mới không?
- Nếu chúng ta dùng 1 template và không thay đổi thì sẽ không tạo ra file mới.
Nên sử dụng các biến local 0-7 như thế nào?
- Do các biến này có giới hạn nên ta hãy cân nhắc đến việc quy định mỗi 1 dịch vụ ta muốn chuyển đi gắn với 1 local chứ không phải mỗi 1 file log trong dịch vụ.
Tổng kết
Đến đây mình tin rằng các bạn đã có cái nhìn tổng quan về Log, Syslog và Rsyslog. Việc cấu hình Rsyslog không khó, chỉ cần các bạn hiểu rõ được nhiệm vụ và chức năng của từng module là các bạn có thể làm được dễ dàng. Hy vọng những kiến thức này sẽ giúp bạn thực hiện cấu hình thành công trên hệ thống của mình. Nếu gặp phải những vấn đề cần giải đáp, hãy liên hệ với chúng tôi để được hỗ trợ sớm nhất nhé.