2013-01-20 5 views
5

मैं अजगर लॉगिंग उपयोग कर रहा हूँ और मैं एक फ़ॉर्मेटर कि ऐसा दिखाई देता है:पायथन लॉगिंग - मैं पथनाम को केवल अंतिम कुछ वर्णों या केवल फ़ाइल नाम में कैसे छोटा कर सकता हूं?

formatter = logging.Formatter(
    '%(asctime)s - %(pathname)86s - %(lineno)4s - %(message)s', '%d %H:%M' 
    ) 

आप देख सकते हैं, मैं अपने लॉग फ़ाइलों में जानकारी कॉलम में बड़े करीने से पंक्तिबद्ध करने के लिए पसंद करते हैं। मेरे पास पथनाम के लिए आरक्षित 86 रिक्त स्थान हैं क्योंकि मेरे प्रोग्राम में उपयोग की जाने वाली कुछ फ़ाइलों के पूर्ण पथ लंबे हैं। हालांकि, मुझे वास्तव में वास्तविक फ़ाइल नाम की आवश्यकता है, पूर्ण पथ नहीं। मैं सिर्फ फाइल नाम देने के लिए लॉगिंग मॉड्यूल कैसे प्राप्त कर सकता हूं? अभी तक बेहतर है, क्योंकि मेरे पास कुछ लंबे फ़ाइल नाम हैं, इसलिए मुझे फ़ाइल नाम के पहले 3 वर्ण, '~', फिर अंतिम 16 वर्णों के बाद चाहिए। तो

/Users/Jon/important_dir/dev/my_project/latest/testing-tools/test_read_only_scenarios_happily.py 

हो जाना चाहिए

tes~arios_happily.py 
+0

मैं अपने सुझाव संपादित देखा; खुशी है कि आपने इसे काम किया। 'record.args' या तो एक dict या tuple है, लेकिन आपके फ़ॉर्मेटर ने सुझाव दिया है कि आप विशेष रूप से एक dict का उपयोग कर रहे थे, इसलिए मैंने इसके आधार पर अपना समाधान बनाया। जैसा कि आपने पाया, एक टुपल को भी अनुकूलित करना काफी आसान है। :-) –

उत्तर

7

आप अपनी खुद की फ़ॉर्मेटर उपवर्ग है कि आप के लिए पथ ट्रंकेटस लागू करने के लिए होगा; इस वर्ग के बजाय सामान्य logging.Formatter उदाहरण के

import logging 
import os 

class PathTruncatingFormatter(logging.Formatter): 
    def format(self, record): 
     if isinstance(record.args, dict) and 'pathname' in record.args: 
      # truncate the pathname 
      filename = os.path.basename(record.args['pathname']) 
      if len(filename) > 20: 
       filename = '{}~{}'.format(filename[:3], filename[-16:]) 
      record.args['pathname'] = filename 
     return super(PathTruncatingFormatter, self).format(record) 

उपयोग:: स्वरूपण स्ट्रिंग यह कर सकते हैं नहीं

formatter = logging.PathTruncatingFormatter(
    '%(asctime)s - %(pathname)86s - %(lineno)4s - %(message)s', '%d %H:%M' 
    ) 
+1

'python3.4' के साथ, पथनाम 'record.pathname' – Nick

+0

में है यदि मैं logging.ini फ़ाइल का उपयोग कर रहा हूं तो ऐसा करने का कोई तरीका है? –

+0

@ सौरवप्रम: नहीं, क्योंकि आप 'logging.ini' में एक कस्टम क्लास को परिभाषित नहीं कर सकते हैं। –

1

इस तरह:

import os 

def shorten_filename(filename): 
    f = os.path.split(filename)[1] 
    return "%s~%s" % (f[:3], f[-16:]) if len(f) > 19 else f 
+0

माइनर नाइट, मैं 'लेन (एफ)> 20' का उपयोग करता हूं, क्योंकि संक्षिप्त फ़ाइल नाम में 20 वर्ण होंगे (1 9 फ़ाइल नाम से लिया गया है और टिल्डे)। – chepner

+0

धन्यवाद। हालांकि, यह उत्तर लॉगिंग मॉड्यूल के संदर्भ में समस्या का समाधान नहीं करता है। – jononomo

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

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