Trăn đuôi dài

Trong quá trình vận hành và sử dụng phần mềm, "phần mềm" cũng có lúc khỏe lúc nhẹ, lúc hoạt động trơn tru, lúc lại nhão dẹo. Vì vậy, có những cách nào để "phần mềm" thông báo trạng thái hoạt động của mình với người dùng, IT-OP, lập trình viên?

Tại sao must set log ?

Thông thường trong quá trình xây dựng và phát triển phần mềm, các thành viên lập trình sẽ đặt các câu lệnh try. ________số 8. tại các vị trí "nhạy cảm" có thể gây ra lỗi và bung màn hình các cảnh báo cho người dùng biết về các sự cố xảy ra hoặc thông báo cho người dùng các vấn đề cần lưu ý (ví dụ như không được phép . )
Việc bung ra các cảnh báo này phải được tính toán sao cho "thân thiện", dễ hiểu, hạn chế bung ra các lỗi của hệ thống mà chỉ có mấy ông dev mới hiểu được. ))

Vì vậy, muốn kiểm tra lỗi của phần mềm thì IT-OPs/Dev phải làm thế nào?

Nếu bạn mang câu hỏi này đi hỏi các lập trình viên có kinh nghiệm, câu trả lời dễ tìm thấy là "Ghi lỗi vào tệp nhật ký để có lỗi còn biết mà kiểm tra & sửa lỗi chứ" ( Vấn đề là khi đi "ăn vạ"

Một số lập trình viên có thói quen đặt câu lệnh in ra màn hình bảng điều khiển các thông tin trong quá trình ứng dụng chạy để "gỡ lỗi chạy", trước khi phát hành thì thực hiện "xào" (thực hiện chuyển lệnh thành nhận xét) hoặc xóa . Thật là mất thời gian và nếu có sai sót lại mất thêm cả thời gian để sửa lỗi

Trăn đuôi dài

Tệp nhật ký phải chỉ để ghi lỗi?

Tệp nhật ký thường được ưu tiên đầu tiên để ghi vào lỗi nhưng có những hệ thống đặc biệt, bên ngoài nhật ký lỗi thì tệp nhật ký còn có thể chứa các thông tin liên quan đến hành động của người dùng vào hệ thống.
Ví dụ. Hệ thống fintech liên quan đến thanh toán giao dịch tiền, toàn bộ hành động của người dùng trên phần mềm (hoặc ứng dụng web) đều cần phải ghi vào nhật ký.
- Khi người dùng đăng nhập vào --> Ghi lại log để có thể theo dõi thói quen của người dùng. Từ đó có thể trích xuất thông tin trong khoảng thời gian từ vài giờ đến vài giờ người dùng sẽ sử dụng nhiều ứng dụng.
- Khi thực hiện lệnh thanh toán tiền --> Ghi lại thông tin của hàng khác + thông tin đích đến + thông tin số tiền để thực hiện đối chiếu dữ liệu mỗi ngày< .
....

Qua hai mục đầu trên, chúng ta đã thấy tầm quan trọng của tệp nhật ký, vậy đặt nhật ký như thế nào để đạt hiệu quả và dễ dàng khai thác thông tin sau này?

Ghi log thế nào cho hiệu quả?

1. Nhật ký định dạng

Để sử dụng nhật ký đạt hiệu quả, trong mỗi nhóm hoặc mỗi công ty cần có một tiêu chuẩn đặt nhật ký của họ để dễ dàng sử dụng sau khi thu thập nhật ký về một hệ thống lưu trữ chung

Một cụm log nên chứa các thông tin sau

  • Ngày giờ. log time, feature to milisecond, định dạng nên sử dụng. yyyy-MM-dd HH. mm. ss,sss. Ví dụ. 2020-09-17 09. 50. 55,901. Hoặc có thể sử dụng ISO local datetime (có thêm múi giờ)
  • Mức đăng nhập. Phân loại theo từng mục đích sử dụng, phân loại theo quy định chung của từng công ty. Việc phân chia log-level sẽ giúp cho việc giám sát/bảo trì phần mềm thuận tiện hơn. Các mức log thường gặp. GỠ LỖI, THÔNG TIN, CẢNH BÁO, LỖI, NGHIÊM TÚC/FATAL
  • Tên thành phần/mô-đun/chức năng phát sinh ra nhật ký, nên đưa cả dòng phát sinh ra lỗi (nếu có thể phát hiện ra trong cảnh báo lỗi)
  • Nội dung nhật ký. Nội dung error muốn ghi vào file log
  • Yêu cầu ID. Id của phiên/phiên làm việc/yêu cầu thực hiện các hành động để sinh ra nhật ký. Nếu có trường dữ liệu này, khi kiểm tra các sự kiện của phiên trong nhật ký tệp, chỉ cần thực hiện CTRL + F (nếu mở tệp nhật ký bằng trình chỉnh sửa) hoặc mèo. tiếng kêu. (nếu xem nhật ký từ màn hình thiết bị đầu cuối)
  • đầu vào tham số. Thông tin dữ liệu đầu vào yêu cầu đến
  • Kết quả đầu ra. Đầu dữ liệu thông báo do hệ thống trả về cho yêu cầu đến

Ví dụ. Một kiểu định dạng nhật ký như sau.
Ngày giờ, Cấp nhật ký, Thành phần [dòng mã] [Lớp/Tên tệp] [phương thức/chức năng. ] Nội dung nhật ký [đầu vào tham số] [đầu ra tham số]

2020-09-22 20:05:12,636 INFO: [in ./app/api/report.py:341] [d20200922h2005id1001] create report success with account quangvinh1986 410421/200/Ok

import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
0

2. Log-level note note

Như đã viết ở trên, log-level đã được định nghĩa và sử dụng tùy mục đích mục đích sử dụng và phân loại của từng công ty. Dưới đây là một cách định nghĩa (mà các bạn có thể tham khảo)

GỠ LỖI.
Dùng log để gỡ lỗi (rất nhiều và hỗn loạn). Mục đích sử dụng thông thường là dành cho nhà phát triển.
Thông thường là đặt cấp độ nhật ký, bật trên môi trường LOCAL/DEVELOPING và vô hiệu hóa trong PRODUCTION do số lượng nhật ký dữ liệu sẽ rất nhiều. Tuy nhiên, đôi khi bạn cũng phải bật lại mức log này trên PRODUCTION để thực hiện ghi nhật ký và phát hiện ra các lỗi chỉ xảy ra trên PRODUCTION (Không phát sinh trên cục bộ).

Ví dụ. Hệ thống dữ liệu trên PRODUCTION thường lớn hơn nhiều so với DEVELOPING nên lượng trường hợp xảy ra khi áp dụng dữ liệu vào phần mềm cũng nhiều hơn. Các trường hợp thử nghiệm có thể chưa bao gồm các chỉ số được hết các lỗi --> Việc đặt gỡ lỗi có thể giúp nhà phát triển/người thử nghiệm có thể giả lập lại được chính xác toàn bộ tác vụ, quy trình làm việc của cụm dữ liệu khi đi vào/đi ra khỏi

THÔNG TIN.
Log mang tính chất cung cấp thông tin chung, không nên mang ý nghĩa chỉ lỗi.
Ví dụ. Thao tác đăng nhập vào hệ thống của tài khoản bất kỳ, phiên bản của phần mềm,.

CẢNH BÁO (CẢNH BÁO).
Đăng lại các lỗi ẩn, có thể gây ra lỗi nhưng không ảnh hưởng đến trải nghiệm của người dùng.
Ví dụ. Khách hàng cố tình nhấn nhiều lần vào nút thanh toán khi người dùng không đủ điều kiện để thanh toán, các cảnh báo sẽ được ghi lại khi khách hàng "cố gắng" làm sai hướng dẫn.

LỖI.
Ghi lại các sự kiện trên hệ thống đã gây ra lỗi tương đối lớn, có thể gây ảnh hưởng đến trải nghiệm của người dùng.

Ví dụ. Khách hàng thanh toán tiền cho dịch vụ A nhưng không thể trừ tiền của khách hàng do hệ thống thanh toán đang quá tải. Mỗi LỖI sẽ được ghi vào log-files để sau này có thể phản đối việc kiểm soát bị lỗi quá tải đã gây ảnh hưởng đến bao nhiêu khách hàng

FATAL/CRITICAL.
Đăng nhập chỉ định để ghi lại các lỗi nghiêm trọng, ngay cả khi chính nó đã gây ra gián đoạn dịch vụ, treo/sập phần mềm.

Ví dụ.
Phần mềm dùng nhiều, chiếm dụng RAM nhiều, gây tràn bộ nhớ, phần mềm trước khi tự động tắt sẽ đưa ra các thông báo.

Trăn đuôi dài

Ghi chú. Với các dạng trường hợp này, ngoài việc ghi vào tệp nhật ký thì nên thực hiện thông báo trực tiếp qua các kênh truyền thông với IT-Ops hoặc nhà phát triển

3. Hỗ trợ ghi thư viện ?

Một thành viên lập trình, việc ghi nhật ký theo định dạng như trên là một thử nghiệm khác về định dạng chuỗi, định dạng thời gian,.
Hiểu được điều này ngôn ngữ lập trình hiện đại sẽ có các mô-đun/thư viện hỗ trợ công việc ghi nhật ký cho đúng chuẩn và tiết kiệm thời gian, tài nguyên.
Ví dụ. Thư viện Log4j cho java, thư viện log4net cho. mạng của Apache,.

Với ngôn ngữ lập trình Python, không cần thiết phải cài đặt/thêm thư viện giảm của cơ sở thứ 3 vào dự án của mình. Mọi thứ đã có sẵn trong ghi nhật ký mô-đun. Việc lập trình viên chỉ là nhập vào sử dụng

Trăn đuôi dài

Set log with logging trong python

Ngôn ngữ lập trình Python cung cấp một mô-đun cho phép các thành viên lập trình thực hiện việc đặt nhật ký trong ứng dụng của mình đang ghi nhật ký.
Sử dụng ghi nhật ký, lập trình viên sẽ được cung cấp các chức năng sau.

  • Create the messagebao gồm cả dấu thời gian
  • Hiện có các loglevel. Thông tin, Cảnh báo, Gỡ lỗi, Lỗi
  • Có thể chọn đặt đăng nhập màn hình bảng điều khiển hoặc ghi ra tệp
  • Dễ dàng thực hiện on/off process set log
  • Partition file log to many phase by dung lượng, theo thời gian

Chúng ta sẽ cùng nhau khám phá về việc ghi nhật ký qua các ví dụ dưới đây nhé!

1. Đặt nhật ký, nhập dữ liệu vào màn hình bảng điều khiển

import logging

logging.basicConfig(format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')

Trăn đuôi dài

Mặc định thì log sẽ được đưa vào màn hình console, tất nhiên là màn hình console chỉ dành cho lập trình viên khi thực hiện gỡ lỗi nên các ứng dụng khi đưa lên PRODUCTION thì cần đặt log vào một tệp nhật ký

import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')

Trăn đuôi dài

Lưu ý.
Tên tệp trường dữ liệu có thể là đường dẫn tuyệt đối hoặc tương đối đến vị trí đặt tệp.
Đôi khi có thêm nhật ký, mặc định là nhật ký mới sẽ thêm vào cuối tệp nhật ký cũ.

Trường dữ liệu cấp sẽ thiết lập nhật ký dữ liệu nào được phép hiển thị theo từng cấp bậc.
Ví dụ ở trên chúng ta thiết lập level=logging. INFO, at the command line under the logging. debug('Đây là thông báo nhật ký gỡ lỗi. ') nhưng trong nhật ký tệp không xuất hiện dòng lệnh này do thứ tự "cấp bậc" của INFO lớn hơn GỠ LỖI.

Thứ tự các mức được mặc định như sau.
GỠ LỖI -> THÔNG TIN -> CẢNH BÁO -> LỖI -> QUAN TRỌNG

Trong một phiên làm việc, việc ghi nhật ký chỉ nhận một mức giá trị, muốn thay đổi mức ghi nhật ký, tùy chỉnh nhiều hơn, chúng ta nên sử dụng các trình xử lý đối tượng của việc ghi nhật ký

2. Trình xử lý nhật ký đối tượng

Các trình xử lý ghi nhật ký đối tượng, chúng ta có thể tìm hiểu chúng ở đường dẫn sau. https. // tài liệu. con trăn. org/3/thư viện/ghi nhật ký. người xử lý. html

Để tìm hiểu về các đối tượng này, chúng ta sẽ đi đến ví dụ dưới đây

Trăn đuôi dài

Thông tin mới.
______11. will for the path to file. py and line number bao nhiêu thực hiện log

import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
2. Lớp cung cấp khả năng định dạng kiểu đầu ra của nhật ký.
______10. Class thực hiện log vào file set log.
import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
1. Class thực hiện log ra màn hình console.

import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
2 --> Khởi tạo một đối tượng đại diện cho mô-đun ghi nhật ký trong mô-đun (tệp. py) hiện tại

Đoạn script trên sẽ xuất ra cả tệp và màn hình bảng điều khiển. Theo như log-level thì trên file log sẽ ra cụm từ

import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
3, trên màn hình console sẽ ra cụm từ
import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
4

Trăn đuôi dài

Trăn đuôi dài

Như đã nêu ở trên, trong phần nhật ký có thêm cụm thông tin tên tệp - dòng bao nhiêu [trong. \handlers. py. 26], đoạn dữ liệu này được cấu hình bởi đoạn cấu hình

import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
1 trong
import logging

logging.basicConfig(filename='log_filename.log', format='%(asctime)s - %(levelname)s - %(message)s', level=logging.INFO)
logging.debug('This is a debug log message.')
logging.info('This is a info log message.')
logging.warning('This is a warning log message.')
logging.error('This is a error log message.')
logging.critical('This is a critical log message.')
2

3. Xoay tệp nhật ký

Sau một khoảng thời gian làm việc, file log lớn quá gây khó khăn cho việc đọc/ghi/theo dõi log. Mô-đun ghi nhật ký cung cấp việc thực hiện tách nhật ký tệp thành nhiều tệp khác nhau theo kích thước hoặc thời gian