2013-01-20 9 views
5

Sto usando la registrazione di pitone e ho un formattatore che è simile al seguente:logging python - come posso troncare il pathname solo agli ultimi caratteri o solo al nome file?

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

Come potete vedere, mi piace l'informazione nei miei file di log di allineare ordinatamente in colonne. Il motivo per cui ho 86 spazi riservati per il percorso è perché i percorsi completi di alcuni dei file utilizzati nel mio programma sono così lunghi. Tuttavia, tutto ciò di cui ho veramente bisogno è il nome del file effettivo, non il percorso completo. Come posso ottenere il modulo di registrazione per darmi solo il nome del file? Meglio ancora, dato che ho alcuni nomi di file lunghi, vorrei i primi 3 caratteri del nome del file, seguito da '~', quindi gli ultimi 16 caratteri. Così

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

dovrebbe diventare

tes~arios_happily.py 
+0

Ho visto la tua modifica proposta; felice che tu l'abbia risolto. 'record.args' è un dict o una tupla, ma il formattatore ti ha suggerito di utilizzare esclusivamente un dettato, motivo per cui ho creato la mia soluzione basandomi su questo. È facile adattarsi anche a una tupla, come hai scoperto. :-) –

risposta

7

Dovrete implementare la propria sottoclasse Formatter che tronca il percorso per voi; la stringa di formattazione non può farlo:

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) 

Utilizzare questa classe invece del normale logging.Formatter esempio:

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

Con 'python3.4', il percorso è in' record.pathname' – Nick

+0

C'è un modo per farlo se sto usando il file logging.ini? –

+0

@SouravPrem: no, perché non è possibile definire una classe personalizzata in 'logging.ini'. –

1

Ti piace questa:

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

Nit minore, userei 'len (f)> 20', poiché il nome del file abbreviato avrà comunque 20 caratteri (19 presi dal nome del file più la tilde). – chepner

+0

Grazie. Tuttavia, questa risposta non affronta il problema nel contesto del modulo di registrazione. – jononomo

Problemi correlati