Mô-đun ghi nhật ký cũng cho phép bạn ghi lại toàn bộ dấu vết ngăn xếp trong một ứng dụng. Thông tin ngoại lệ có thể được nắm bắt nếu tham số
import logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
9 được chuyển thành import logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
0 và các hàm ghi nhật ký được gọi như thế nàyimport logging
a = 5
b = 0
try:
c = a / b
except Exception as e:
logging.error["Exception occurred", exc_info=True]
Đây là những gì bạn sẽ nhận được
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
Nếu
import logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
9 không được đặt thành import logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
0, đầu ra của chương trình trên sẽ không cho chúng ta biết bất cứ điều gì về ngoại lệ, trong một tình huống thực tế, có thể không đơn giản như một import logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
3. Hãy tưởng tượng bạn đang cố gỡ lỗi trong một cơ sở mã phức tạp với nhật ký chỉ hiển thị điều này Ghi nhật ký được sử dụng để theo dõi các sự kiện xảy ra khi ứng dụng chạy. Các cuộc gọi ghi nhật ký được thêm vào mã ứng dụng để ghi lại hoặc ghi nhật ký các sự kiện và lỗi xảy ra trong quá trình thực thi chương trình. Trong Python, mô-đun ghi nhật ký được sử dụng để ghi lại các sự kiện và lỗi đó
Một sự kiện có thể được mô tả bằng một thông báo và có thể tùy ý chứa dữ liệu dành riêng cho sự kiện đó. Các sự kiện cũng có cấp độ hoặc mức độ nghiêm trọng do nhà phát triển chỉ định
Ghi nhật ký rất hữu ích để gỡ lỗi và theo dõi bất kỳ thông tin cần thiết nào
Cách sử dụng ghi nhật ký trong Python
Mô-đun ghi nhật ký
Thư viện chuẩn Python chứa mô-đun ghi nhật ký cung cấp khung linh hoạt để ghi thông điệp tường trình từ mã Python. Mô-đun này được sử dụng rộng rãi và là điểm khởi đầu cho hầu hết các nhà phát triển Python sử dụng ghi nhật ký
Mô-đun ghi nhật ký cung cấp các cách để ứng dụng định cấu hình các trình xử lý nhật ký khác nhau và định tuyến các thông báo nhật ký tới các trình xử lý này. Điều này cho phép cấu hình rất linh hoạt giúp xử lý nhiều trường hợp sử dụng khác nhau
Để viết một thông điệp tường trình, người gọi yêu cầu một trình ghi nhật ký có tên. Trình ghi nhật ký này có thể được sử dụng để ghi các thông báo được định dạng bằng cấp nhật ký [DEBUG, INFO, ERROR, v.v.]. Đây là một ví dụ
import logging
log = logging.getLogger["mylogger"]
log.info["Hello World"]
Cấp độ ghi nhật ký
Các cấp độ ghi nhật ký tiêu chuẩn trong Python [theo thứ tự mức độ nghiêm trọng tăng dần] và khả năng ứng dụng của chúng là
- GỠ LỖI - Thông tin chi tiết, thường được quan tâm khi chẩn đoán sự cố
- THÔNG TIN - Xác nhận mọi thứ hoạt động như mong đợi
- CẢNH BÁO - Dấu hiệu của một điều gì đó không mong muốn hoặc một vấn đề trong tương lai gần e. g. 'dung lượng ổ đĩa thấp'
- LỖI - Một vấn đề nghiêm trọng hơn do đó chương trình không thể thực hiện chức năng
- NGHIÊM TÚC - Một lỗi nghiêm trọng, chỉ ra rằng bản thân chương trình có thể không thể tiếp tục thực thi
Cấp độ nhật ký mặc định là CẢNH BÁO, có nghĩa là chỉ các sự kiện ở cấp độ này trở lên mới được ghi lại theo mặc định
Định cấu hình ghi nhật ký
Nói chung, một cấu hình bao gồm việc thêm Trình định dạng và Trình xử lý vào bộ ghi gốc. Mô-đun ghi nhật ký Python cung cấp một số cách để định cấu hình ghi nhật ký
- Tạo trình ghi nhật ký, trình xử lý và trình định dạng theo chương trình gọi các phương thức cấu hình
- Tạo một tệp cấu hình ghi nhật ký và đọc nó
- Tạo từ điển thông tin cấu hình và chuyển nó tới hàm
2import logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%[levelname]s:%[asctime]s] %[message]s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig[MY_LOGGING_CONFIG] logger = logging.getLogger['mylogger'] logger.info['info log']
Tài liệu Python chính thức khuyên bạn nên định cấu hình bộ ghi lỗi thông qua từ điển Python. Để làm điều này
import logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
3 cần được gọi chấp nhận từ điển làm đối số. Lược đồ của nó là
4 - Nên là 1 để tương thích ngượcimport logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%[levelname]s:%[asctime]s] %[message]s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig[MY_LOGGING_CONFIG] logger = logging.getLogger['mylogger'] logger.info['info log']
5 - Tắt cấu hình cho các bộ ghi hiện có. Đây làimport logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%[levelname]s:%[asctime]s] %[message]s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig[MY_LOGGING_CONFIG] logger = logging.getLogger['mylogger'] logger.info['info log']
6 theo mặc địnhimport logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%[levelname]s:%[asctime]s] %[message]s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig[MY_LOGGING_CONFIG] logger = logging.getLogger['mylogger'] logger.info['info log']
7 — Cài đặt trình định dạngimport logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%[levelname]s:%[asctime]s] %[message]s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig[MY_LOGGING_CONFIG] logger = logging.getLogger['mylogger'] logger.info['info log']
8 — Cài đặt trình xử lýimport logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%[levelname]s:%[asctime]s] %[message]s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig[MY_LOGGING_CONFIG] logger = logging.getLogger['mylogger'] logger.info['info log']
9 — Cài đặt nhật kýimport logging.config MY_LOGGING_CONFIG = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { 'default_formatter': { 'format': '[%[levelname]s:%[asctime]s] %[message]s' }, }, 'handlers': { 'stream_handler': { 'class': 'logging.StreamHandler', 'formatter': 'default_formatter', }, }, 'loggers': { 'mylogger': { 'handlers': ['stream_handler'], 'level': 'INFO', 'propagate': True } } } logging.config.dictConfig[MY_LOGGING_CONFIG] logger = logging.getLogger['mylogger'] logger.info['info log']
Cách tốt nhất là định cấu hình điều này bằng cách tạo một mô-đun mới e. g.
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
10 hoặc ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
11. Đây là một ví dụimport logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
Cách sử dụng ghi nhật ký để gỡ lỗi
Bên cạnh các mức ghi nhật ký được mô tả trước đó, các trường hợp ngoại lệ cũng có thể được ghi lại với thông tin truy nguyên liên quan. Với
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
12, thông tin truy nguyên có thể được đưa vào cùng với thông báo trong trường hợp có bất kỳ lỗi nào. Điều này có thể rất hữu ích cho các vấn đề gỡ lỗi. Đây là một ví dụERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
1Chạy đoạn mã trên tạo ra đầu ra sau
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
6Đầu ra bao gồm thông báo cũng như thông tin truy nguyên, có thể được sử dụng để gỡ lỗi sự cố
Ví dụ về nhật ký Python
Ghi nhật ký cơ bản
Đây là một ví dụ rất đơn giản về ghi nhật ký bằng trình ghi nhật ký gốc với cấu hình cơ bản
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
7Ở đây, cấu hình ghi nhật ký lỗi Python cơ bản đã được thiết lập bằng cách sử dụng
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
13. Cấp độ nhật ký được đặt thành ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
14, có nghĩa là các thư có cấp độ từ ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
15 trở lên sẽ được ghi lại. Chạy đoạn mã trên tạo ra đầu ra sauimport logging
log = logging.getLogger["mylogger"]
log.info["Hello World"]
1Thông báo được in ra bàn điều khiển, là đích đầu ra mặc định. Thông báo được in bao gồm cấp độ và mô tả sự kiện được cung cấp trong cuộc gọi ghi nhật ký
Đăng nhập vào một tập tin
Một trường hợp sử dụng rất phổ biến là ghi các sự kiện vào một tệp. Đây là một ví dụ
import logging
log = logging.getLogger["mylogger"]
log.info["Hello World"]
2Chạy đoạn mã trên sẽ tạo một tệp nhật ký
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
16 trong thư mục làm việc hiện tại [nếu nó chưa tồn tại]. Tất cả các thông điệp bản ghi tiếp theo sẽ chuyển thẳng đến tệp này. Tệp phải chứa thông báo tường trình sau khi đoạn mã trên được thực thiimport logging
log = logging.getLogger["mylogger"]
log.info["Hello World"]
1
Định dạng tin nhắn nhật ký
Định dạng thông báo tường trình có thể được chỉ định bằng cách sử dụng đối số
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
17 của ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
13. Đây là một ví dụimport logging
log = logging.getLogger["mylogger"]
log.info["Hello World"]
7Chạy đoạn mã trên sẽ thay đổi định dạng thông báo nhật ký để hiển thị thời gian, cấp độ và thông báo và tạo ra kết quả sau
import logging
log = logging.getLogger["mylogger"]
log.info["Hello World"]
8
Ghi nhật ký lỗi Python bằng Trình xử lý và Trình định dạng
Trình xử lý và trình định dạng được sử dụng để thiết lập vị trí đầu ra và định dạng thông báo cho bộ ghi nhật ký. Lớp
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
19 có thể được sử dụng để thiết lập tệp đầu ra cho nhật kýimport logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
0Chạy đoạn mã trên sẽ tạo tệp nhật ký
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
16 nếu nó chưa tồn tại và ghi thông báo tường trình sau vào tệpimport logging.config
MY_LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'default_formatter': {
'format': '[%[levelname]s:%[asctime]s] %[message]s'
},
},
'handlers': {
'stream_handler': {
'class': 'logging.StreamHandler',
'formatter': 'default_formatter',
},
},
'loggers': {
'mylogger': {
'handlers': ['stream_handler'],
'level': 'INFO',
'propagate': True
}
}
}
logging.config.dictConfig[MY_LOGGING_CONFIG]
logger = logging.getLogger['mylogger']
logger.info['info log']
1
Các câu hỏi thường gặp
Đăng nhập bằng Python là gì?
Đăng nhập Python cho phép theo dõi các sự kiện trong quá trình thực hiện chương trình. Nhật ký được thêm vào mã ứng dụng để cho biết sự xuất hiện của một số sự kiện. Một sự kiện được mô tả bằng một thông báo và dữ liệu biến tùy chọn dành riêng cho sự kiện. Trong Python, mô-đun ghi nhật ký tích hợp có thể được sử dụng để ghi nhật ký các sự kiện
Thông báo nhật ký có thể có 5 cấp độ - GỠ LỖI, INGO, CẢNH BÁO, LỖI và PHÉP QUAN TRỌNG. Họ cũng có thể bao gồm thông tin truy nguyên cho các trường hợp ngoại lệ. Nhật ký có thể đặc biệt hữu ích trong trường hợp có lỗi để giúp xác định nguyên nhân của chúng
Ghi nhật ký getLogger Python là gì?
Để bắt đầu ghi nhật ký bằng mô-đun ghi nhật ký Python, chức năng xuất xưởng
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
61 thường được thực thi. Hàm ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
62 chấp nhận một đối số duy nhất - tên của bộ ghi. Nó trả về một tham chiếu đến một phiên bản trình ghi với tên được chỉ định nếu được cung cấp hoặc gốc nếu không. Nhiều cuộc gọi đến ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
62 có cùng tên sẽ trả về một tham chiếu đến cùng một đối tượng loggerBất kỳ tên logger nào cũng có thể được cung cấp, nhưng quy ước là sử dụng biến
ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
64 làm đối số, chứa tên của mô-đun hiện tại. Các tên được phân tách bằng dấu chấm [. ] và là các cấu trúc phân cấp. Những người ghi nhật ký ở xa hơn trong danh sách là con của những người ghi nhật ký cao hơn trong danh sách. Ví dụ: được cung cấp một logger ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
65, các logger tiếp theo như ERROR:root:Exception occurred
Traceback [most recent call last]:
File "exceptions.py", line 6, in
c = a / b
ZeroDivisionError: division by zero
[Finished in 0.2s]
66 là hậu duệ của foo