2016-03-30 23 views
0

Mükemmel bir şekilde çalışan bir python betikleri zincirim var. Yapmaya çalıştığım şey, bu komut dosyasında sahip olduğum tüm yazdırma ifadelerini günlüğe kaydetmek için python günlüğe kaydetme modülünü kullanmaktır (bu betiğin amacını unutun. Yapmaya çalıştığım tek şey, tüm bu yazdırma deyimlerini kaydetmek için günlüğe kaydetme yeteneği eklemek) konsolda göstermek) bir günlük dosyasına giriş yapmanız: Ben here bakıyor ve bir şeyler denedik ama oldukça benim kodunda bu çözümü sığdırmak mümkün değildipython'u kullanarak varolan komut dosyasına günlüğe kaydetme

from __future__ import print_function 
#import MySQLdb 
import pymysql 
import shutil 
import os 
import sys 
import io 
import string 
import traceback 
import time 
from watchdog.observers import Observer 
from watchdog.events import PatternMatchingEventHandler 
from colorama import * 
init() 
# ==== FOR THE TRANSFORMATION SCRIPT ==== 
from datetime import tzinfo, timedelta, datetime 
import pytz 
import codecs 
from pytz import timezone 
import csv 
# ======================================= 

if not os.path.exists('Archive'): 
    os.mkdir("Archive") 
if not os.path.exists('Failed'): 
    os.mkdir("Failed") 

class MyHandler(PatternMatchingEventHandler): 
    patterns = ["*.csv","*.processing", "*.transforming","*.loading"] 

    def process(self, event): 
     """ 
     event.event_type 
      'modified' | 'created' | 'moved' | 'deleted' 
     event.is_directory 
      True | False 
     event.src_path 
      path/to/observed/file 
     """ 
     eventFileName = event.src_path 
     eventType = event.event_type 
     if eventType == 'moved': 
      eventFileName = event.dest_path 
     fileNameWithPath, fileExtension = os.path.splitext(eventFileName) 
     if fileExtension == '.csv': 
      print (Back.GREEN +'Entering copier.py...'+ Style.RESET_ALL) 
      execfile('./copier_MySQL.py') 
     #if fileExtension == '.processing': 
     # print (Back.GREEN +'Entering parser_MySQL.py...'+ Style.RESET_ALL) 
     # execfile('./parser_MySQL.py') 
     if fileExtension == '.processing': #change this to '.transforming' if the above parser_MySQL.py is uncommented 
      t = time.time() 
      print (Back.GREEN +'Entering transform_MySQL.py...'+ Style.RESET_ALL) 
      execfile('./transform_MySQL.py') 
      elapsed = time.time() - t 
      print (Back.MAGENTA +'Time took to transform the file = '+str(elapsed)+ Style.RESET_ALL) 
      print (Back.BLUE + "Exiting transform_MySQL.py..." + Style.RESET_ALL) 
      print (Fore.YELLOW + "-----------#*#*#*-----------#*#*#*-----------" + Style.RESET_ALL) 
     if fileExtension == '.loading': 
      if os.path.isfile(eventFileName): 
       t = time.time() 
       print (Back.GREEN +'Entering sweeper.py...'+ Style.RESET_ALL) 
       execfile('./sweeper_MySQL.py') 
       elapsed = time.time() - t 
       print (Back.MAGENTA +'Time took to load the file into database = '+str(elapsed-1)+ Style.RESET_ALL) 
       print (Back.BLUE +"Disconnected from the MySQL server. Exiting sweeper.py..."+ Style.RESET_ALL) 
       print (Fore.YELLOW+'-----------#*#*#*-----------#*#*#*-----------'+ Style.RESET_ALL) 
      else: 
       print (Fore.RED+eventFileName+' is not created by transform_MySQL.py. Check the above messages. NOT executing sweeper_MySQL.py'+ Style.RESET_ALL) 
    def on_moved(self, event): 
     self.process(event) 

    def on_created(self, event): 
     self.process(event) 

if __name__ == '__main__': 
    observer = Observer() 
    observer.schedule(MyHandler(), path='.') 
    observer.start() 

    try: 
     while True: 
      time.sleep(1) 
    except KeyboardInterrupt: 
     observer.stop() 

    observer.join() 

. Herhangi bir yardım çok takdir edilir.

+1

Neden sadece bir dosyaya çıktı yönlendirmek? "myscript.py> myscript.log' – russdot

+0

@russdot, bu komutun, görüntülenecek (bu baskı ifadeleri) yazdırılacak ve günlük mesajlarını bir dosyaya kaydedecek şekilde yazdırılmayacağı izlenen bilgisayar üzerinde çalışacak şekilde tasarlanmıştır, bu yüzden'> myscript .log' gerçekten istediğim ama yapamayacağımı dilediğim şey. –

+0

@russdot, xi_'in yorumunu aşağıdaki cevaba bakarak bakarsanız, o, python'un günlüğe kaydetme modülüne bağlandı. Tüm bu işlevsellik otomatik olarak günlüğe kaydetme bilgilerine eklenir, bir satırlık biçim ifadesi alır. Bunu manuel olarak yapmak ve bir günlük dosyasına yazmak, tekerleği yeniden icat eden çok sayıda kod satırını içerecektir, bu nedenle python'un günlüğe kaydetme modülünü kullanmamın bir başka nedeni de budur. –

cevap

3

Baskılar yerine logging modülünü kullanabilirsiniz.

import logging 
logging.basicConfig(level=logging.DEBUG) 
logging.debug(Back.GREEN +'Entering sweeper.py...'+ Style.RESET_ALL) 

çıkış set dosyası kaydetmek için:

logging.basicConfig(filename='myscript.log', level=logging.DEBUG) 
+0

düşündüğüm şey bu, ama bu baskı ifadelerini bir dosyaya kaydediyor mu? –

+0

@NikhilGupta emin, güncellenmiş cevabı kontrol et –

+0

Bunu deneyeceğim ve geri döneceğim. Ayrıca, bu ifadede "level = logging.DEBUG, logging.ERROR, logging.INFO' vb." Gibi bir çok düzey kullanabilir miyim? –

İlgili konular