2012-02-02 37 views
18

Tôi có một chương trình python đang ghi vào một tệp nhật ký đang được quay bằng lệnh logrotate của Linux. Khi điều này xảy ra, tôi cần báo hiệu chương trình của mình để ngừng ghi vào tệp cũ và bắt đầu ghi vào tệp mới. Tôi có thể xử lý tín hiệu nhưng làm thế nào để tôi nói với python để ghi vào tập tin mới?Ghi nhật ký và quay các tập tin bằng Python

Tôi mở tập tin như thế này:

logging.basicConfig(format='%(asctime)s:%(filename)s:%(levelname)s:%(message)s',filename=log_file, level=logging.INFO) 

và văn bản cho nó như thế này:

logging.log(level,"%s" % (msg)) 

Các module khai thác gỗ trông rất mạnh mẽ nhưng cũng tràn ngập. Cảm ơn.

Trả lời

14

Bạn có thể muốn xem WatchedFileHandler để thực hiện việc này hoặc thay thế, thực hiện xoay vòng nhật ký với RotatingFileHandler, cả hai đều nằm trong số logging.handlers module.

+0

Cảm ơn! Nếu tôi cần tôi có thể đi tuyến đường này nhưng hiện tại tệp đã được chuyển bên ngoài mã của tôi. Tôi đã hy vọng có một cách để đóng nhật ký và mở lại nó. – fredsnertz

+0

Ah ... WatchedFileHandler ... bây giờ tôi hiểu rồi. – fredsnertz

4
from logging import handlers 

handler = handlers.TimedRotatingFileHandler(filename, when=LOG_ROTATE) 

handler.setFormatter(logging.Formatter(log_format, datefmt="%d-%m-%Y %H:%M:%S")) 

#LOG_ROTATE = midnight  
#set your log format 

này sẽ giúp bạn trong việc xử lý xoay log

7

Kể từ vòng xoay đang được thực hiện bằng cách logrotate, trong xử lý tín hiệu của bạn, bạn chỉ nên gọi logging.basicConfig(...) một lần nữa và rằng nên mở lại tập tin đăng nhập.

13

Không sử dụng logging.basicConfig, sử dụng WatchedFileHandler. Đây là cách sử dụng nó.

import time 
import logging 
import logging.handlers 

def log_setup(): 
    log_handler = logging.handlers.WatchedFileHandler('my.log') 
    formatter = logging.Formatter(
     '%(asctime)s program_name [%(process)d]: %(message)s', 
     '%b %d %H:%M:%S') 
    formatter.converter = time.gmtime # if you want UTC time 
    log_handler.setFormatter(formatter) 
    logger = logging.getLogger() 
    logger.addHandler(log_handler) 
    logger.setLevel(logging.DEBUG) 

log_setup() 
logging.info('Hello, World!') 
import os 
os.rename('my.log', 'my.log-old') 
logging.info('Hello, New World!') 
+0

Cảm ơn ví dụ! Rất giống với những gì tôi đã cố gắng làm :) – houcros

+0

Lưu ý rằng theo tài liệu, điều này chỉ hoạt động trên * nix. –

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