Heim  >  Artikel  >  Backend-Entwicklung  >  Wozu dient das Protokollierungsmodul in Python? Einführung in die Verwendung des Protokollierungsmoduls

Wozu dient das Protokollierungsmodul in Python? Einführung in die Verwendung des Protokollierungsmoduls

不言
不言Original
2018-09-15 13:53:052779Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Verwendung des Protokollierungsmoduls in Python. Die Einführung in die Verwendung des Protokollierungsmoduls hat einen gewissen Referenzwert. Ich hoffe, dass es für Sie hilfreich ist.

Das Protokollierungsmodul ist ein integriertes Modul, das mit Python geliefert wird und eine Standardprotokollierungsschnittstelle

Liste der Protokollebenen

Logger bereitstellt : Protokolle generieren Objekt
Filter: Objekt zum Filtern von Protokollen
Handler: empfängt Protokolle und steuert dann das Drucken an verschiedene Orte. FileHandler wird zum Drucken in Dateien verwendet, StreamHandler wird zum Drucken auf dem Terminal verwendet
Formatierer: anders Protokolle können ein benutzerdefiniertes Formatobjekt sein und es dann an verschiedene Handler-Objekte binden, um die Protokollformate verschiedener Handler zu steuern

Codebeispiele für die Verwendung mehrerer Objekte:

'''critical=50
error =40
warning =30
info = 20
debug =10'''
 
 import logging 
#1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出logger=logging.getLogger(__file__) 
#2、Filter对象:不常用,略
 #3、Handler对象:接收logger传来的日志,然后控制输出h1=logging.FileHandler('t1.log') #打印到文件h2=logging.FileHandler('t2.log') #打印到文件h3=logging.StreamHandler() #打印到终端
 #4、Formatter对象:日志格式formmater1=logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',)
 
formmater2=logging.Formatter('%(asctime)s :  %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',)
 
formmater3=logging.Formatter('%(name)s %(message)s',) 
 
#5、为Handler对象绑定格式h1.setFormatter(formmater1)
h2.setFormatter(formmater2)
h3.setFormatter(formmater3) 
#6、将Handler添加给logger并设置日志级别logger.addHandler(h1)
logger.addHandler(h2)
logger.addHandler(h3)
logger.setLevel(10) 
#7、测试logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

Hinweis: Das Protokoll wird be Der Logger filtert zuerst einmal und dann zum Handler-Objekt. Wenn das Handler-Objekt und das Logger-Objekt gleichzeitig die Protokollebene festlegen, wird die endgültige Protokollebene entsprechend der höchsten der beiden Ebenen festgelegt

die in der Funktion logging.basicConfig() zu finden ist. Das Standardverhalten des Protokollierungsmoduls kann durch bestimmte Parameter geändert werden. Die verfügbaren Parameter sind
Dateiname: Erstellen Sie einen FiledHandler mit dem angegebenen Dateinamen, damit das Protokoll erstellt wird in der angegebenen Datei gespeichert werden.
Dateimodus: Die Dateiöffnungsmethode. Bei Verwendung dieses Parameters ist der Standardwert „a“ und kann auch als „w“ angegeben werden.
Format: Geben Sie das vom Handler verwendete Protokollanzeigeformat an.
datefmt: Geben Sie das Datums- und Uhrzeitformat an.
Level: Legen Sie die Protokollebene des Rootloggers fest.
Stream: Erstellen Sie einen StreamHandler mit dem angegebenen Stream. Sie können die Ausgabe in sys.stderr, sys.stdout oder einer Datei angeben. Der Standardwert ist sys.stderr. Wenn sowohl Dateiname als auch Stream-Parameter gleichzeitig aufgeführt sind, wird der Stream-Parameter ignoriert.

Die Formatzeichenfolge, die im Formatparameter verwendet werden kann:

%(name)s Name des Loggers

%(levelno)s Protokollebene in numerischer Form

%(levelname)s Protokollebene in Textform

%(pathname)s Vollständiges Modul, das die Protokollausgabe aufruft Funktionspfadname, möglicherweise nicht

%(filename)s Der Dateiname des Moduls, das die Protokollausgabe aufruft function

%(module)s Der Modulname, der die Protokollausgabe aufruft function

% (funcName)s Der Funktionsname, der die Protokollausgabefunktion aufruft

%(lineno)d Die Codezeile, in der sich die Anweisung befindet, die die Protokollausgabefunktion aufruft

%(created)f Die aktuelle Zeit, im UNIX-Standard. Eine Gleitkommazahl, die die Zeit darstellt.

%(relativeCreated)d Die Anzahl der Millisekunden seit der Erstellung des Loggers bei der Ausgabe von Protokollinformationen

%(asctime)s Die aktuelle Zeit in Stringform. Das Standardformat ist „2003-07-08 16:49:45,896“. Was auf das Komma folgt, sind Millisekunden

%(thread)d Thread-ID. Möglicherweise sind keine

%(threadName)s Thread-Namen vorhanden. Möglicherweise ist keine Prozess-ID

%(process)d vorhanden. Möglicherweise gibt es keine

%(message)s Benutzerausgabenachricht

Angehängt ist eine Protokollvorlage, die direkt verwendet werden kann:

"""
logging配置
"""
 
import os
import logging.config
 
# 定义三种日志输出格式 开始
 
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]' #其中name为getlogger指定的名字
 
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
 
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
 
# 定义日志输出格式 结束
 
logfile_dir = os.path.dirname(os.path.abspath(__file__))  # log文件的目录
 
logfile_name = 'all2.log'  # log文件名
 
# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):
    os.mkdir(logfile_dir)
 
# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)
 
# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},
    'handlers': {
        #打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        #打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'DEBUG',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024*1024*5,  # 日志大小 5M
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        #logging.getLogger(__name__)拿到的logger配置
        # 这里的logger对象名字为''是为了getLogger()获取不同的日志对象时能获取相同的配置,当想要让不同的日志对象有不同的配
# 置时,可在这里添加logger对象
        # 当getLogger()获取的logger对象名称不存在时,如果存在key=''的配置,则使用默认key=''的配置
        '': {
            'handlers': ['default', 'console'],  # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'level': 'DEBUG',
            'propagate': True,  # 向上(更高level的logger)传递
        },
    },
}
 
 
def load_my_logging_cfg(event_log):
    logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
#    logger = logging.getLogger(__name__)  # 生成一个log实例
#    logger.info(event_log)  # 记录事件的日志

Test:

"""
MyLogging Test
"""
import time
import logging
import my_logging  # 导入自定义的logging配置
logger = logging.getLogger(__name__)  # 生成logger实例
def demo():
    logger.debug("start range... time:{}".format(time.time()))
    logger.info("中文测试开始。。。")
    for i in range(10):
        logger.debug("i:{}".format(i))
        time.sleep(0.2)
    else:
        logger.debug("over range... time:{}".format(time.time()))
    logger.info("中文测试结束。。。")
if __name__ == "__main__":
    my_logging.load_my_logging_cfg()  # 在你程序文件的入口加载自定义logging配置
    demo()

Verwandte Empfehlungen:

Verwendung des Protokollierungsmoduls in Python statt Drucken (eine kurze Anleitung zur Protokollierung)

Verwendungsbeispiele von das Protokollierungsmodul in Python

Das obige ist der detaillierte Inhalt vonWozu dient das Protokollierungsmodul in Python? Einführung in die Verwendung des Protokollierungsmoduls. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn