2012-05-20 34 views
7

Tôi hiện đang làm việc với phiên bản 1.0.0 mô-đun pyftpdlib. Phiên bản mới này sẽ giới thiệu một số thay đổi không tương thích ngược trong rằng một số API nhất định sẽ không còn chấp nhận byte nhưng unicode. Trong khi tôi đang ở đó, như một phần của sự vi phạm này, tôi đã suy nghĩ về khả năng của để loại bỏ chức năng ghi nhật ký của mình, hiện đang sử dụng câu lệnh in và sử dụng mô-đun ghi nhật ký.Ưu điểm của việc ghi nhật ký so với in() + thực hành tốt nhất ghi nhật ký

Tính đến ngay bây giờ pyftpdlib đại biểu logging tới 3 chức năng:

def log(s): 
    """Log messages intended for the end user.""" 
    print s 

def logline(s): 
    """Log commands and responses passing through the command channel.""" 
    print s 

def logerror(s): 
    """Log traceback outputs occurring in case of errors.""" 
    print >> sys.stderr, s 

Người dùng sẵn sàng để tùy chỉnh các bản ghi (ví dụ viết chúng vào một tập tin) được phải chỉ ghi đè lên những 3 chức năng như trong:

>>> from pyftpdlib import ftpserver 
>>> 
>>> def log2file(s): 
...  open('ftpd.log', 'a').write(s) 
... 
>>> ftpserver.log = ftpserver.logline = ftpserver.logerror = log2file 

Bây giờ tôi tự hỏi: những lợi ích nào ngụ ý để loại bỏ phương pháp này và sử dụng mô-đun ghi nhật ký thay thế? Từ góc độ của nhà cung cấp mô-đun, tôi cho rằng chính xác như thế nào để hiển thị các chức năng ghi nhật ký trong mô-đun của tôi? Tôi phải làm điều này:

import logging 
logger = logging.getLogger("pyftpdlib") 

... và tiểu bang trong doc của tôi rằng "logger" là đối tượng mà là vụ sẽ được sử dụng trong trường hợp người dùng muốn tùy chỉnh cách cư xử bản ghi? Có hợp pháp để cố định đặt đầu ra định dạng được xác định trước như sau:

FORMAT = '[%(asctime)] %(message)s' 
logging.basicConfig(format=FORMAT) 
logger = logging.getLogger('pyftpdlib') 

...?

Bạn có thể nghĩ đến mô-đun bên thứ ba mà tôi có thể lấy tín hiệu từ nơi chức năng ghi nhật ký được hiển thị và hợp nhất như một phần của API công khai không?

Xin cảm ơn trước.

Trả lời

0

Đây là tài nguyên tôi đã sử dụng để tạo logger tùy chỉnh. Tôi đã không thay đổi nhiều, tôi chỉ cần thêm một tuyên bố nếu, và vượt qua trong hay không tôi muốn đăng nhập vào một tập tin hoặc chỉ là giao diện điều khiển.

Kiểm tra this Tô màu. Nó thực sự tốt đẹp cho colorizing đầu ra nên DEBUG trông khác với WARN trông khác với INFO.

Mô-đun ghi nhật ký bao gồm rất nhiều chức năng đẹp, như ghi nhật ký SMTP, ghi nhật ký xoay tệp (vì vậy bạn có thể lưu một vài tệp nhật ký cũ, nhưng không tạo 100 tệp mỗi khi có sự cố).

Nếu bạn muốn di chuyển sang Python 3, sử dụng mô-đun ghi nhật ký sẽ xóa nhu cầu thay đổi các câu lệnh in của bạn.

Ghi nhật ký thật tuyệt vời tùy thuộc vào những gì bạn đang làm, tôi chỉ sử dụng nhẹ trước khi xem tôi đang ở đâu trong chương trình (nếu bạn đang chạy chức năng này, tô màu theo cách này), nhưng nó có ý nghĩa hơn sức mạnh hơn một bản in thông thường.

0

Bạn có thể xem Django (chỉ cần tạo một dự án mẫu) và xem cách nó khởi tạo hệ thống con đăng nhập.

Ngoài ra còn có contextual logger helper mà tôi đã viết một thời gian trước đây - trình ghi nhật ký này tự động lấy tên của mô-đun/lớp/chức năng được khởi tạo từ đó.Điều này rất hữu ích cho việc gỡ lỗi các thông điệp nơi bạn có thể thấy ngay thông qua mô-đun đó phun các thông điệp và cách luồng cuộc gọi đi.

3

thư viện (máy chủ ftp hoặc thư viện khách hàng) không bao giờ nên khởi tạo hệ thống ghi nhật ký. Vì vậy, nó là ok để khởi tạo một đối tượng logger và trỏ vào log.basicConfig trong tài liệu (hoặc cung cấp một hàm dọc theo dòng basicConfig với đầu ra fancier và cho phép người dùng chọn trong chiến lược cấu hình ghi nhật ký của mình, thư viện plainConfig hoặc cấu hình được cung cấp)

khuôn khổ (ví dụ: django) hoặc máy chủ (daemon máy chủ ftp) nên khởi tạo hệ thống ghi nhật ký thành hợp lý mặc định và cho phép tùy chỉnh cấu hình hệ thống ghi nhật ký.

2

Thông thường thư viện chỉ cần tạo một trình xử lý NullHandler, mà chỉ đơn giản là một trình xử lý không có gì. Người dùng cuối hoặc nhà phát triển ứng dụng sử dụng thư viện của bạn sau đó có thể định cấu hình hệ thống ghi nhật ký. Xem phần Configuring Logging for a Library trong tài liệu logging để biết thêm thông tin. Cụ thể, hãy xem ghi chú bắt đầu

Bạn nên thêm bất kỳ trình xử lý nào khác ngoài NullHandler vào nhật ký của thư viện.

Trong trường hợp của bạn tôi chỉ đơn giản sẽ tạo ra một handler khai thác gỗ, theo các tài liệu hướng dẫn khai thác gỗ,

import logging 
logging.getLogger('pyftpdlib').addHandler(logging.NullHandler()) 

Sửa Việc thực hiện khai thác gỗ phác thảo ra trong câu hỏi dường như hoàn toàn hợp lý. Trong tài liệu của bạn, bạn chỉ cần đề cập đến logger và thảo luận hoặc hướng người dùng đến các phương pháp logging.setLevellogging.setFormatter để tùy chỉnh đầu ra từ thư viện của bạn. Thay vì sử dụng logging.basicConfig(format=FORMAT), bạn có thể xem xét sử dụng logging.config.fileConfig để quản lý cài đặt cho đầu ra của mình và ghi lại tệp cấu hình ở đâu đó trong tài liệu của mình, một lần nữa trỏ người dùng đến tài liệu mô-đun đăng nhập cho định dạng được mong đợi trong tệp này.

+0

Điều đó có nghĩa là không có đầu ra nào được tạo theo mặc định? Trong trường hợp đó tôi không hài lòng với nó. –

+0

Điều này sẽ không tạo ra bất kỳ đầu ra nào theo mặc định. Ngoài ra, 'logging.NullHandler' chỉ có sẵn trong Python 2.7 (và> 3.2 tôi nghĩ), mà có thể là một vấn đề. Nếu bạn chỉ sử dụng 'logger = logging.getLogger ('pyftpdlib')', bạn sẽ nhận được các thông báo theo mặc định và bạn chỉ có thể trỏ người dùng của bạn đến tài liệu 'logging.setLevel' và' logging.setFormatter' để minh họa cách cấu hình đầu ra tin nhắn cho thư viện của bạn. Ngoài ra, bạn có thể sử dụng cấu hình tệp ['logging.config.fileConfig'] (http://docs.python.org/dev/library/logging.config.html#logging.config.fileConfig) để cho phép người dùng định cấu hình logger – Chris

+0

Ngoài ra, để trả lời một trong các câu hỏi ban đầu của bạn, lợi ích của việc sử dụng ghi nhật ký thay vì các câu lệnh in được đề cập ngắn gọn trong [PEP 282] (http://www.python.org/dev/peps/pep-0282/): * Nếu một cơ chế đăng nhập duy nhất được ghi trong thư viện chuẩn, 1) ghi nhật ký có nhiều khả năng được thực hiện 'tốt', và 2) nhiều thư viện sẽ có thể được tích hợp vào các ứng dụng lớn hơn có thể ghi lại một cách hợp lý. * – Chris

Các vấn đề liên quan