python
  • logging
  • 2008-12-03 4288 views 6 likes 
    6

    Tôi đang cố triển khai trình xử lý ghi nhật ký python có tên là TimedRotatingFileHandler.TimedRotatingFileHandler Thay đổi tên tệp?

    Khi cuộn tới nửa đêm, nó sẽ thêm ngày hiện tại vào biểu mẫu: "YYYY-MM-DD".

    LOGGING_MSG_FORMAT = '%(name)-14s > [%(levelname)s] [%(asctime)s] : %(message)s' 
    LOGGING_DATE_FORMAT = '%Y-%m-%d %H:%M:%S' 
    
    logging.basicConfig(
          level=logging.DEBUG, 
          format=LOGGING_MSG_FORMAT, 
          datefmt=LOGGING_DATE_FORMAT 
          ) 
    root_logger = logging.getLogger('') 
    logger = logging.handlers.TimedRotatingFileHandler("C:\\logs\\Rotate_Test",'midnight',1) 
    root_logger.addHandler(logger) 
    while True: 
        daemon_logger = logging.getLogger('TEST') 
        daemon_logger.info("SDFKLDSKLFFJKLSDD") 
        time.sleep(60) 
    

    Các log file đầu tiên tạo ra được gọi là chỉ "Rotate_Test", sau đó khi nó cuộn qua đến ngày hôm sau nó thay đổi tên tập tin vào: "Rotate_Test.YYYY-MM-DD" Where YYYY-MM-DD là ngày hiện tại.

    Tôi làm cách nào để thay đổi tên tệp? Tôi googled và nhìn vào API và tìm thấy khá nhiều không có gì.

    Trả lời

    23

    "Làm cách nào để thay đổi tên tệp?"

    Vì tài liệu không được ghi lại, tôi đã chọn đọc nguồn. Đây là những gì tôi đã kết luận từ việc đọc nguồn của logging/handlers.py

    handler = logging.handlers.TimedRotatingFileHandler("C:\\isis_ops\\logs\\Rotate_Test",'midnight',1) 
    handler.suffix = "%Y-%m-%d" # or anything else that strftime will allow 
    root_logger.addHandler(handler) 
    

    Hậu tố là chuỗi định dạng.

    +0

    Đó là rất hữu ích , cảm ơn bạn! – Nobilis

    1

    Cảm ơn.

    Tôi đã xem nguồn.

    Không thực sự là một cách để thay đổi biểu mẫu của nó. Vì thao tác hậu tố, chỉ gắn thêm vào cuối tên tệp. Ether cách, không có cách nào thực sự để thao tác tên tập tin đầy đủ, những gì tôi đã hy vọng là nơi bạn có thể tuyên bố một mặt nạ tập tin, và khi nó "RollOver" nó sẽ tạo ra một tên tập tin mới dựa trên mặt nạ tập tin . Tôi sẽ quay trở lại ý tưởng ban đầu của mình, là chỉ cần giết toàn bộ hệ thống con đăng nhập và khởi tạo lại nó với tên tệp mới khi nó là RollsOver.

    Cảm ơn Tho.

    +1

    Tại sao không viết trình xử lý của riêng bạn? Điều đó dường như đủ đơn giản. Bạn không phải sử dụng trình xử lý của họ.API cho một trình xử lý rất đơn giản (tôi nghĩ đó là phương thức 'emit'. –

    +0

    Đó thực sự không phải là một ý tưởng tồi, tôi đã xem xét kỹ hơn mã này. Tôi sẽ cung cấp cho một shot. :) Cảm ơn. – UberJumper

    1

    Chỉ cần cập nhật, tôi đã kết thúc một cách tiếp cận khác.

    Cách dễ nhất tôi tìm thấy để sửa đổi đầu ra tệp, là chỉ cần sử dụng một FileHandler, sau đó khi đó là thời gian để làm một cuộn qua.

    Tôi làm điều này:

    if(current_time > old_time): 
        for each in logging.getLogger('Debug').handlers: 
         each.stream = open("C:\\NewOutput", 'a') 
    

    Thats các ý chính của nó. Phải mất rất nhiều poking và nhìn xung quanh nhưng thay đổi dòng là cách dễ nhất để làm như vậy.

    :)

    2

    Có cách tiếp cận khác cho vấn đề này: ví dụ, tôi cần phải xoay bản ghi trên một cơ sở hàng ngày nhưng họ phải được đặt tên với một hậu tố trong% d% định dạng% m Y ...

    Vì vậy, tôi đã viết bản phối lại TimedRotatingFileHandler!

    try: 
        import codecs 
    except ImportError: 
        codecs = None 
    import logging.handlers 
    import time 
    import os 
    
    class MyTimedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler): 
        def __init__(self,dir_log): 
        self.dir_log = dir_log 
        filename = self.dir_log+time.strftime("%m%d%Y")+".txt" #dir_log here MUST be with os.sep on the end 
        logging.handlers.TimedRotatingFileHandler.__init__(self,filename, when='midnight', interval=1, backupCount=0, encoding=None) 
        def doRollover(self): 
        """ 
        TimedRotatingFileHandler remix - rotates logs on daily basis, and filename of current logfile is time.strftime("%m%d%Y")+".txt" always 
        """ 
        self.stream.close() 
        # get the time that this sequence started at and make it a TimeTuple 
        t = self.rolloverAt - self.interval 
        timeTuple = time.localtime(t) 
        self.baseFilename = self.dir_log+time.strftime("%m%d%Y")+".txt" 
        if self.encoding: 
        self.stream = codecs.open(self.baseFilename, 'w', self.encoding) 
        else: 
        self.stream = open(self.baseFilename, 'w') 
        self.rolloverAt = self.rolloverAt + self.interval 
    
    1

    Bạn có thể làm điều này bằng cách thay đổi hậu tố log như gợi ý ở trên nhưng bạn cũng sẽ cần phải thay đổi biến extMatch để phù hợp với hậu tố cho nó để tìm file xoay:

    handler.suffix = "%Y%m%d" 
    handler.extMatch = re.compile(r"^\d{8}$") 
    
    Các vấn đề liên quan