Hướng dẫn python logging to elasticsearch - python ghi nhật ký vào đàn hồi
Hướng dẫn này trình bày cách ăn nhật ký từ ứng dụng Python và cung cấp chúng một cách an toàn vào triển khai dịch vụ elaticsearch. Bạn sẽ thiết lập FileBeat để theo dõi tệp nhật ký có cấu trúc JSON có các trường được định dạng Lược đồ phổ biến (ECS) tiêu chuẩn và sau đó bạn sẽ xem trực quan hóa thời gian thực của các sự kiện nhật ký trong Kibana khi chúng xảy ra. Mặc dù Python được sử dụng cho ví dụ này, cách tiếp cận này để giám sát đầu ra nhật ký được áp dụng trên nhiều loại khách. Kiểm tra danh sách các plugin ghi nhật ký ECS có sẵn. Bạn sẽ học cách:
Thời gian cần thiết: 1 giờ Điều kiện tiên quyếtĐể hoàn thành các bước này, bạn cần cài đặt Python trên hệ thống của bạn cũng như bộ ghi Lược đồ chung (ECS) đàn hồi cho thư viện ghi nhật ký Python. Để cài đặt ECS-Logging-Python, Run: python -m pip install ecs-logging Nhận elaticsearch ServiceEdit
Không muốn đăng ký vào một dịch vụ khác? Bạn cũng có thể nhận dịch vụ Elaticsearch thông qua các thị trường AWS, Azure và GCP. Kết nối an toànKhi kết nối với dịch vụ Elaticsearch, bạn có thể sử dụng ID đám mây để chỉ định chi tiết kết nối. Tìm ID đám mây của bạn bằng cách vào menu chính Kibana và chọn Quản lý> Tích hợp, sau đó chọn chi tiết triển khai xem. Để kết nối, truyền dữ liệu đến và phát hành các truy vấn với dịch vụ Elaticsearch, bạn cần suy nghĩ về xác thực. Hai cơ chế xác thực được hỗ trợ, khóa API và xác thực cơ bản. Ở đây, để bạn bắt đầu nhanh chóng, chúng tôi sẽ chỉ cho bạn cách sử dụng xác thực cơ bản, nhưng bạn cũng có thể tạo các khóa API như được hiển thị sau. Khóa API an toàn hơn và ưa thích cho môi trường sản xuất. Tạo tập lệnh Python với LoggeditTrong bước này, bạn sẽ tạo một tập lệnh Python tạo ra các nhật ký ở định dạng JSON, sử dụng mô -đun ghi nhật ký tiêu chuẩn Python.
Thiết lập FileBeateditFileBeat cung cấp một cách đơn giản, dễ dàng để định cấu hình để giám sát các tệp nhật ký Python của bạn và chuyển dữ liệu nhật ký vào dịch vụ Elaticsearch. Nhận FileBeat Tải xuống FileBeat và giải nén nó trên máy chủ cục bộ mà bạn muốn thu thập dữ liệu. Định cấu hình FileBeat để truy cập dịch vụ elaticsearch Trong / FileBeat- / (trong đó thư mục trong đó FileBeat được cài đặt và là số phiên bản FileBeat), hãy mở tệp cấu hình FileBeat.yml để chỉnh sửa. # =============================== Elastic Cloud ================================ # These settings simplify using Filebeat with the Elastic Cloud (https://cloud.elastic.co/). # The cloud.id setting overwrites the `output.elasticsearch.hosts` and # `setup.kibana.host` options. # You can find the `cloud.id` in the Elastic Cloud web UI. cloud.id: my-deployment:long-hash # The cloud.auth setting overwrites the `output.elasticsearch.username` and # `output.elasticsearch.password` settings. The format is `
Định cấu hình đầu vào FileBeat FileBeat có một số cách để thu thập nhật ký. Đối với ví dụ này, bạn sẽ định cấu hình bộ sưu tập nhật ký theo cách thủ công. Trong phần FileBeat.Inputs của FileBeat.yml, đặt đã bật: thành đúng và đặt đường dẫn: đến vị trí của tệp nhật ký hoặc tệp của bạn. Trong ví dụ này, đặt cùng một thư mục trong đó bạn đã lưu elvis.py: filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /path/to/log/files/*.json Bạn có thể chỉ định ký tự ký tự đại diện (*) để chỉ ra rằng tất cả các tệp nhật ký trong thư mục được chỉ định nên được đọc. Bạn cũng có thể sử dụng ký tự đại diện để đọc nhật ký từ nhiều thư mục. Ví dụ #!/usr/bin/python import logging import ecs_logging import time from random import randint #logger = logging.getLogger(__name__) logger = logging.getLogger("app") logger.setLevel(logging.DEBUG) handler = logging.FileHandler('elvis.json') handler.setFormatter(ecs_logging.StdlibFormatter()) logger.addHandler(handler) print("Generating log entries...") messages = [ "Elvis has left the building.",# "Elvis has left the oven on.", "Elvis has two left feet.", "Elvis was left out in the cold.", "Elvis was left holding the baby.", "Elvis left the cake out in the rain.", "Elvis came out of left field.", "Elvis exited stage left.", "Elvis took a left turn.", "Elvis left no stone unturned.", "Elvis picked up where he left off.", "Elvis's train has left the station." ] while True: random1 = randint(0,15) random2 = randint(1,10) if random1 > 11: random1 = 0 if(random1<=4): logger.info(messages[random1], extra={"http.request.body.content": messages[random1]}) elif(random1>=5 and random1<=8): logger.warning(messages[random1], extra={"http.request.body.content": messages[random1]}) elif(random1>=9 and random1<=10): logger.error(messages[random1], extra={"http.request.body.content": messages[random1]}) else: logger.critical(messages[random1], extra={"http.request.body.content": messages[random1]}) time.sleep(random2)6. Thêm các tùy chọn đầu vào JSON Tùy chọn cấu hình đầu vào FileBeat, bao gồm một số cài đặt để giải mã các thông báo JSON. Các tệp nhật ký được giải mã theo từng dòng, do đó, điều quan trọng là chúng có chứa một đối tượng JSON trên mỗi dòng. Đối với ví dụ này, FileBeat sử dụng bốn tùy chọn giải mã sau đây. json.keys_under_root: true json.overwrite_keys: true json.add_error_key: true json.expand_keys: true Để tìm hiểu thêm về các cài đặt này, hãy kiểm tra các tùy chọn cấu hình đầu vào JSON và giải mã các trường JSON trong tham chiếu FileBeat. Nối bốn tùy chọn giải mã JSON vào phần đầu vào FileBeat của FileBeat.yml, để phần này trông như thế này: # ============================== Filebeat inputs =============================== filebeat.inputs: # Each - is an input. Most options can be set at the input level, so # you can use different inputs for various configurations. # Below are the input specific configurations. - type: log # Change to true to enable this input configuration. enabled: true # Paths that should be crawled and fetched. Glob based paths. paths: - /path/to/log/files/*.json json.keys_under_root: true json.overwrite_keys: true json.add_error_key: true json.expand_keys: true Kết thúc việc thiết lập FileBeat FileBeat đi kèm với các tài sản được xác định trước để phân tích cú pháp, lập chỉ mục và trực quan hóa dữ liệu của bạn. Để tải các tài sản này, hãy chạy các tài sản sau từ thư mục cài đặt FileBeat: Tùy thuộc vào các biến bao gồm vị trí cài đặt, môi trường và quyền cục bộ, bạn có thể cần thay đổi quyền sở hữu của FileBeat.yml. Bạn cũng có thể thử chạy lệnh dưới dạng root: sudo ./filebeat setup -e hoặc bạn có thể vô hiệu hóa kiểm tra quyền nghiêm ngặt bằng cách chạy lệnh với tùy chọn #!/usr/bin/python import logging import ecs_logging import time from random import randint #logger = logging.getLogger(__name__) logger = logging.getLogger("app") logger.setLevel(logging.DEBUG) handler = logging.FileHandler('elvis.json') handler.setFormatter(ecs_logging.StdlibFormatter()) logger.addHandler(handler) print("Generating log entries...") messages = [ "Elvis has left the building.",# "Elvis has left the oven on.", "Elvis has two left feet.", "Elvis was left out in the cold.", "Elvis was left holding the baby.", "Elvis left the cake out in the rain.", "Elvis came out of left field.", "Elvis exited stage left.", "Elvis took a left turn.", "Elvis left no stone unturned.", "Elvis picked up where he left off.", "Elvis's train has left the station." ] while True: random1 = randint(0,15) random2 = randint(1,10) if random1 > 11: random1 = 0 if(random1<=4): logger.info(messages[random1], extra={"http.request.body.content": messages[random1]}) elif(random1>=5 and random1<=8): logger.warning(messages[random1], extra={"http.request.body.content": messages[random1]}) elif(random1>=9 and random1<=10): logger.error(messages[random1], extra={"http.request.body.content": messages[random1]}) else: logger.critical(messages[random1], extra={"http.request.body.content": messages[random1]}) time.sleep(random2)7. Quá trình thiết lập mất vài phút. Nếu mọi thứ diễn ra thành công, bạn sẽ nhận được tin nhắn xác nhận: Chế độ xem dữ liệu FileBeat (trước đây là mẫu chỉ mục) hiện có sẵn trong ElaticSearch. Để xác minh: Bắt đầu với Phiên bản Stack 8.0, các mẫu chỉ số Kibana đã được đổi tên thành các chế độ xem dữ liệu. Để tìm hiểu thêm, hãy kiểm tra Kibana những gì mới trong trang 8.0.
Tùy chọn: Sử dụng khóa API để xác thực Để bảo mật bổ sung, thay vì sử dụng xác thực cơ bản, bạn có thể tạo khóa API Elaticsearch thông qua bảng điều khiển dịch vụ Elaticsearch, sau đó định cấu hình FileBeat để sử dụng khóa mới để kết nối an toàn với triển khai dịch vụ elaticsearch.
Gửi nhật ký Python đến ElaticsearcheditĐó là thời gian để gửi một số dữ liệu nhật ký vào Elaticsearch! Khởi chạy FileBeat và Elvis.py Khởi chạy FileBeat bằng cách chạy các phần sau từ thư mục cài đặt FileBeat: #!/usr/bin/python import logging import ecs_logging import time from random import randint #logger = logging.getLogger(__name__) logger = logging.getLogger("app") logger.setLevel(logging.DEBUG) handler = logging.FileHandler('elvis.json') handler.setFormatter(ecs_logging.StdlibFormatter()) logger.addHandler(handler) print("Generating log entries...") messages = [ "Elvis has left the building.",# "Elvis has left the oven on.", "Elvis has two left feet.", "Elvis was left out in the cold.", "Elvis was left holding the baby.", "Elvis left the cake out in the rain.", "Elvis came out of left field.", "Elvis exited stage left.", "Elvis took a left turn.", "Elvis left no stone unturned.", "Elvis picked up where he left off.", "Elvis's train has left the station." ] while True: random1 = randint(0,15) random2 = randint(1,10) if random1 > 11: random1 = 0 if(random1<=4): logger.info(messages[random1], extra={"http.request.body.content": messages[random1]}) elif(random1>=5 and random1<=8): logger.warning(messages[random1], extra={"http.request.body.content": messages[random1]}) elif(random1>=9 and random1<=10): logger.error(messages[random1], extra={"http.request.body.content": messages[random1]}) else: logger.critical(messages[random1], extra={"http.request.body.content": messages[random1]}) time.sleep(random2)0 Trong lệnh này:
Chỉ trong trường hợp lệnh không hoạt động như mong đợi, hãy kiểm tra FileBeat nhanh bắt đầu cho cú pháp lệnh chi tiết cho hệ điều hành của bạn. Bạn cũng có thể thử chạy lệnh dưới dạng root: sudo ./filebeat -e -c filebeat.yml. FileBeat hiện nên chạy và theo dõi nội dung của Elvis.json, mà thực sự không tồn tại. Vì vậy, hãy để tạo ra nó. Mở một phiên bản đầu cuối mới và chạy tập lệnh elvis.py Python: Hãy để kịch bản chạy trong vài phút và có thể pha cà phê nhanh hoặc trà. Sau đó, đảm bảo rằng tệp elvis.json được tạo như mong đợi và được điền với một số mục nhật ký. Xác minh các mục nhật ký trong dịch vụ elaticsearch Bước tiếp theo là xác nhận rằng dữ liệu nhật ký đã tìm thấy thành công nó vào dịch vụ Elaticsearch.
Chế độ xem dữ liệu FileBeat hiển thị một danh sách các trường và chi tiết của chúng. Tạo trực quan hóa nhật ký trong kibanaeditBây giờ, thời gian để tạo trực quan hóa dựa trên dữ liệu nhật ký ứng dụng Python.
Hãy để tạo ra một hình ảnh thứ hai.
Hãy để tạo ra một hình ảnh thứ hai.
Chọn Tạo trực quan. Một lần nữa, hãy chắc chắn rằng loại biểu đồ được đặt thành thanh dọc xếp chồng lên nhau. Kéo và thả trường http.request.body.content vào trình tạo trực quan.
Và bây giờ cho hình ảnh cuối cùng. |