2012-02-02 11 views
18

मेरे पास एक पायथन प्रोग्राम है जो एक लॉग फ़ाइल को लिख रहा है जिसे लिनक्स के लॉग्रोट कमांड द्वारा घुमाया जा रहा है। जब ऐसा होता है तो मुझे पुरानी फ़ाइल में लिखना बंद करने और नए को लिखना शुरू करने के लिए अपने प्रोग्राम को सिग्नल करने की आवश्यकता होती है। मैं सिग्नल को संभाल सकता हूं लेकिन मैं नई फाइल को लिखने के लिए पायथन कैसे कहूं?पायथन लॉगिंग और घूर्णन फाइलें

मैं इस तरह फ़ाइल खोलने हूँ:

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

और इस तरह यह करने के लिए लिख:

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

लॉगिंग मॉड्यूल बहुत शक्तिशाली लेकिन यह भी भारी लग रहे हो। धन्यवाद।

उत्तर

14

आप इसे लागू करने के लिए WatchedFileHandler पर देख सकते हैं, या वैकल्पिक रूप से RotatingFileHandler के साथ लॉग रोटेशन लागू कर सकते हैं, जिनमें से दोनों logging.handlers module में हैं।

+0

धन्यवाद! अगर मुझे यह रूट करने की ज़रूरत है तो मैं इस रूट पर जा सकता हूं लेकिन वर्तमान में फाइल को पहले से ही मेरे कोड के बाहर घुमाया जा रहा है। मैं उम्मीद कर रहा था कि लॉग बंद करने और इसे फिर से खोलने का एक तरीका था। – fredsnertz

+0

आह ... WatchedFileHandler ... अब मुझे मिल गया। उदाहरण के लिए – 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 

यह घूर्णन लॉग

7

से निपटने के बाद से रोटेशन पहले से ही अपने संकेत हैंडलर तुम सिर्फ logging.basicConfig(...) फिर से बुलाना चाहिए और उस लॉग फ़ाइल फिर से खोलना चाहिए में, logrotate द्वारा किया जा रहा है में मदद करनी चाहिए।

13

logging.basicConfig का उपयोग न करें, WatchedFileHandler का उपयोग करें। यहां इसका उपयोग कैसे करें।

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

धन्यवाद! मैं जो करने की कोशिश कर रहा था उससे बहुत समान :) – houcros

+0

ध्यान दें कि दस्तावेज़ों के अनुसार यह केवल * निक्स पर काम करता है। –

संबंधित मुद्दे