2015-06-12 5 views
5

Bir Flask uygulamasında, bir user_id var olduğunda, üretilen her hata günlüğü kaydına user_id alanı eklemek istiyorum flask.session'da. günlüğü API günlüğü özelleştirmek için yollar (LoggerAdapter, logging.makeRecord sağlar görünüyor, çünküPython Günlüğe kaydetme: LogRecord'a özel bir alan ekleme ve değeri ayarlamak için genel bir geri arama kaydetme

Aşağıda çözüm geldi ama user_id biçimlendirmesini sürücü biçim dizesi için izin vermez çünkü, hackish, ve vb ...) Daha temiz bir yol olması gerektiğini düşünüyorum.

Bunu yapmak için "python yolu" ne olurdu?

class CustomFormatter(Formatter): 
    def format(self, record): 
     from myapp.core import authenticationManager 
     user_id = authenticationManager.current_user_id_if_authenticated() 
     user_id = "unknown" if user_id is None else str(user_id) 
     return super(F,self).format(record) + ", user_id" + user_id 

cevap

5

Sen record.user_id için bir değer enjekte a custom filter tanımlayabiliriz.

format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s') 

ve sonra tüm giriş aramalar otomatik user_id değer katacak: Bu şekilde yapıldığında, diğer (standart) kaydı niteliklerini gibi %(user_id)s içeren bir format tanımlayabilirsiniz.

kullanmak için:

import logaugment 

logaugment.set(logger, user_id='custom_value') 

Tüm giriş aramaları logger şimdi günlüğü mesajında ​​%(user_id)s değerini 'custom_value' kullanacak olan


import logging 

class UserIDFilter(logging.Filter): 
    """ 
    This is a filter which injects contextual information into the log. 
    """ 
    from myapp.core import authenticationManager 

    def filter(self, record): 
     user_id = authenticationManager.current_user_id_if_authenticated() 
     user_id = "unknown" if user_id is None else str(user_id) 
     record.user_id = user_id 
     return True 


logging.basicConfig(
    level=logging.DEBUG, 
    format='%(asctime)-15s %(name)-5s %(levelname)-8s user_id %(user_id)-15s: %(message)s') 

logger = logging.getLogger(__name__) 
filt = UserIDFilter() 
logger.addFilter(filt) 
+0

Teşekkür: (Bu paketi geliştirdi yasal uyarı), ancak 1 yerine True iade edilmelidir: https:

pip install logaugment 

:

yüklemek için // docs .python.org/2/library/logging.html # filtre nesnesi? –

+0

Bir boole bağlamında True olarak değerlendiren herhangi bir nesne yapar. [Docs state] (https://docs.python.org/2/library/logging.html#logging.Logger.filter), "Bu kaydedicinin filtrelerini kayıtlara uygular ve kayıt olması için gerçek bir değer döndürür işlenmiş". Burada '1' üzerinde 'True' seçeneğini tercih ediyorum çünkü nesnenin "boolean-ness" ini kullandığımızı vurgular. – unutbu

0

logaugment (Github page) paket yapar . docs reçete olarak, o inşaat büyük,

+0

Değeri değiştirmek için art arda logaugment.set dosyasını tekrar tekrar arayabilirsiniz. –

+0

Alternatif olarak, bir günlük çağrısı yapıldığında her zaman çağrılacak bir satır belirtebilirsiniz. Bu, kullanıcı kimliğinin dinamik olarak hesaplanmasını/alınmasını sağlar (bkz. README paketindeki örnek). –