2011-10-19 3 views
10

Khi tôi chạy trên mac của tôi:thông điệp Syslog hiển thị như "Unknown" khi tôi sử dụng logging.handlers.SysLogHandler Python của

import logging.handlers 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

syslog_address = '/var/run/syslog' 
logger.addHandler(logging.handlers.SysLogHandler(syslog_address)) 
logger.error("What the crap?") 

Nó hiện lên như thế này trong syslog:

Oct 18 19:02:06 nick Unknown[4294967295] <Error>: What the crap? 

Tại sao nó không xác định? Không nên đủ thông minh để đặt tên cho chính nó sau tên của tập lệnh?

Trả lời

5

Để nhận được những gì bạn cần, bạn nên thêm trình định dạng cho trình xử lý để bạn không phải tự định dạng mọi thư cho chính mình.

import logging.handlers 
logger = logging.getLogger(__name__) 
logger.setLevel(logging.DEBUG) 

syslog_address = '/var/run/syslog' 

handler = logging.handlers.SysLogHandler(syslog_address) 
# create the formatter 
formatter = logging.Formatter('%(name)s: [%(levelname)s] %(message)s') 
# plug this formatter into your handler(s) 
handler.setFormatter(formatter) 

logger.addHandler(handler) 
logger.error("What the crap?") 

Bây giờ bạn sẽ thấy rằng bạn thấy các mục trong syslog như bạn mong muốn:

Jul 4 14:34:40 ip-127-0-0-1 script_name.py: [ERROR] What the crap? 
+2

Dường như API cho các trình xử lý khác nhau giữa một số phiên bản của Python. Tôi chỉ phải làm như sau để xử lý 2 môi trường của chúng tôi: thử: handler.addFormatter (định dạng) ngoại trừ AttributeError, e: handler.formatter = formatter – Splee

15

Tôi nghĩ APP-NAME (cho biết nguồn) là một thành phần tùy chọn trong tiêu đề nhật ký hệ thống. Phiên bản mới nhất của SysLogHandler (cho Python 3.3) bao gồm hỗ trợ cho một APP-NAME (được gọi là ident theo API syslog C), nhưng nó không có sẵn trong các phiên bản trước đó. Xem this Python issue.

Nếu bạn thêm tên kịch bản vào tất cả thư, bạn sẽ nhận được hiệu ứng mong muốn. Ví dụ:

logger.error('foo: What\'s up?') 

sẽ hiển thị ví dụ:

19/10/2011 13:51:17 foo [2147483647] Có chuyện gì vậy?

trong nhật ký.

+0

Theo vấn đề python, bạn có thể đặt thuộc tính 'handler.ident' thành chuỗi và nó sẽ được tự động thêm vào tất cả các thư. – Hubro

+0

@Hubro đúng, đó là phần bổ sung sau vào mã đăng nhập - nó đã được thêm vào như là kết quả của sự cố được liên kết. Giải pháp này dành cho các phiên bản Python cũ hơn. –

+0

Chỉnh sửa sau khi thử nghiệm, nó không đủ để chỉ đưa 'handler.ident' giá trị' "app_name" ', vì nó sẽ chỉ thêm vào nó như là, và bạn kết thúc với một dòng đăng nhập như' "app_nameĐây là một thử nghiệm" '. Bạn phải bao gồm '": "' theo cách thủ công. – Hubro

2

Nó có thể được tìm thấy tất cả các danh sách các từ đó phù hợp với những gì trong danh sách, bạn có thể tìm thấy ở this link

Nếu bạn cần thêm bạn có thể có một cái nhìn xa hơn ví dụ:

from logging.handlers import SysLogHandler 
import logging 

def log(self, severity=logging.DEBUG, message=None): 
    """ 
    Log utility for system wide logging needs 
    @param severity Log severity 
    @param message Log message 
    @return 
    """ 
    logger = logging.getLogger() 
    logger.setLevel(severity) 
    syslog = SysLogHandler(address="/dev/log") 
    syslog.setFormatter(
      logging.Formatter("%(module)s-%(processName)s[%(process)d]: %(name)s: %(message)s") 
    ) 
    logger.addHandler(syslog) 
    logger.log(severity, message) 

Nó khá đơn giản và tôi sử dụng phương pháp này như một gói ghi nhật ký toàn cầu trong các dự án của tôi.