博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
micropython logging文档
阅读量:4488 次
发布时间:2019-06-08

本文共 6664 字,大约阅读时间需要 22 分钟。

1.日志级别Level

日志记录级别的数值在下表中给出。日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

我们设置了输出 level,系统便只会输出 level 数值大于或等于该 level 的的日志结果,例如我们设置了输出日志 level 为 INFO,那么输出级别大于等于 INFO 的日志,如 WARNING、ERROR 等,DEBUG 和 NOSET 级别的不会输出。默认的输出level为INFO。

级别

数值

CRITICAL

50

ERROR

40

WARNING

30

INFO

20

DEBUG

10

NOTSET

0

 

 

 

 

 

 

 

 

 

 

2.logging.basicConfig函数:

通过logging.basicConfig函数对日志的输出格式及方式做相关配置

def basicConfig(level=INFO, filename=None, stream=None, format=None, style="%"):    global _level    _level = level    if filename:        h = FileHandler(filename)    else:        h = StreamHandler(stream)    h.setFormatter(Formatter(format, style=style))    root.handlers.clear()    root.addHandler(h)

logging.basicConfig函数各参数:

level: 设置日志级别,默认为logging.WARNING

filename: 指定日志文件名

format: 指定输出的格式和内容 ,

    %(asctime)s: 打印日志的时间

    %(message)s: 打印日志信息

3.记录器(Logger)

Logger:即 Logger Main Class,是我们进行日志记录时创建的对象

如果没有显式的进行创建,则默认创建一个root logger,并应用默认的日志级别(WARN),处理器Handler(StreamHandler,即将日志信息打印输出在标准输出上),和格式化器Formatter(默认的格式%(message)s)。

创建方法:logger = logging.getLogger()

def getLogger(name=None):    if name is None:        name = "root"    if name in _loggers:        return _loggers[name]    if name == "root":        l = Logger(name)        sh = StreamHandler()        sh.formatter = Formatter()        l.addHandler(sh)    else:        l = Logger(name)    _loggers[name] = l    return l

创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器Handler。

  • logger.setLevel(logging.ERROR)   # 设置日志级别为ERROR,即只有日志级别大于等于ERROR的日志才会输出
  • logger.addHandler(handler_name) # 为Logger实例增加一个处理器

4.处理器(Handler)

处理器将日志记录发送给其他输出终端,他们获取日志记录并用相关函数中处理它们。

比如,一个文件处理器将会获取一条日志记录,并且把它添加到文件中。

本logging 模块提供的 Handler 有:

  • StreamHandler:logging.StreamHandler;日志输出到流,可以是 sys.stderr,sys.stdout 。
  • FileHandler:logging.FileHandler;日志输出到文件。

StreamHandler创建方法:sh = logging.StreamHandler()

class StreamHandler(Handler):    def __init__(self, stream=None):        self._stream = stream or sys.stderr        self.terminator = "\n"        self.formatter = Formatter()    def emit(self, record):        self._stream.write(self.formatter.format(record) + self.terminator)    def flush(self):        pass

 

FileHandler创建方法:fh = logging.FileHandler(filename)

class FileHandler(Handler):    def __init__(self, filename, mode="a", encoding=None, delay=False):        super().__init__()        self.encoding = encoding        self.mode = mode        self.delay = delay        self.terminator = "\n"        self.filename = filename        self._f = None    def emit(self, record):        self._f = open(self.filename, self.mode)        self._f.write(self.formatter.format(record) + self.terminator)    def close(self):        if self._f is not None:            self._f.close()

 

创建完fh/sh后,可以给它设置一个格式化器Formatter
例如:fh.setFormatter(formatter_name)
class Handler:    def __init__(self):        self.formatter = Formatter()    def setFormatter(self, fmt):        self.formatter = fmt

 

5.格式化器(Formatter)

使用Formatter对象设置日志信息最后的规则、结构和内容

formatter创建方法: formatter = logging.Formatter(fmt="%(asctime)s:%(massage)s", datefmt=None)

其中,fmt是消息的格式化字符串,datefmt是日期字符串,但本logging模块不支持。如果不指明fmt,将使用'%(message)s'。

class Formatter:    converter = utime.localtime    def __init__(self, fmt=None, datefmt=None, style="%"):        self.fmt = fmt or "%(message)s"        self.datefmt = datefmt        if style not in ("%", "{
"): raise ValueError("Style must be one of: %, {
") self.style = style def usesTime(self): if self.style == "%": return "%(asctime)" in self.fmt elif self.style == "{
": return "{asctime" in self.fmt def format(self, record): # The message attribute of the record is computed using msg % args. record.message = record.msg % record.args # If the formatting string contains '(asctime)', formatTime() is called to # format the event time. if self.usesTime(): record.asctime = self.formatTime(record, self.datefmt) # If there is exception information, it is formatted using formatException() # and appended to the message. The formatted exception information is cached # in attribute exc_text. if record.exc_info is not None: record.exc_text += self.formatException(record.exc_info) record.message += "\n" + record.exc_text # The record’s attribute dictionary is used as the operand to a string # formatting operation. if self.style == "%": return self.fmt % record.__dict__ elif self.style == "{
": return self.fmt.format(**record.__dict__) else: raise ValueError( "Style {0} is not supported by logging.".format(self.style) ) def formatTime(self, record, datefmt=None): assert datefmt is None # datefmt is not supported ct = utime.localtime(record.created) return "{0}-{1}-{2} {3}:{4}:{5}".format(*ct) def formatException(self, exc_info): raise NotImplementedError() def formatStack(self, stack_info): raise NotImplementedError()

 6.简单使用:

import logginglogging.debug('debug message')logging.info('info message')logging.warning('warn message')logging.error('error message')logging.critical('critical message')

输出:

info messagewarn messageerror messagecritical message

7.简单配置:

logging.basicConfig(level=logging.DEBUG,format='%(asctime)s :  %(message)s')logging.debug('debug message')

输出:

2019-6-18 16:49:10 :  debug message

8.记录日志到文件

import logginglogging.basicConfig(level=logging.DEBUG,filename='/flash/logger.log',format='%(asctime)s :  %(message)s')logging.debug('debug message should go to the log file')logging.info('info message should go to the log file')logging.warning('warn message should go to the log file')logging.error('error message should go to the log file')logging.critical('critical message should go to the log file')

logger.log文件会写入如下内容:

2019-6-18 17:2:20 :  debug message should go to the log file2019-6-18 17:2:25 :  info message should go to the log file2019-6-18 17:2:29 :  warn message should go to the log file2019-6-18 17:2:34 :  error message should go to the log file2019-6-18 17:2:39 :  critical message should go to the log file

9.把日志同时输出到标准输出和日志文件:

import logginglogger=logging.getLogger()fh = logging.FileHandler('a.log')formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setFormatter(formatter)logger.setLevel(level = logging.DEBUG)logger.addHandler(fh)logger.debug('debug message')logger.info('info message')

标准输出:

info message

a.log文件中的内容:

2019-6-18 19:11:22 - root - DEBUG - debug message2019-6-18 19:11:22 - root - INFO - info message

 

 

 

 

转载于:https://www.cnblogs.com/wuweixiong/p/11046286.html

你可能感兴趣的文章
HDU 1533 Going home
查看>>
箭头函数
查看>>
SharePoint【ECMAScript对象模型系列】-- 11. Enable/Disable Ribbon上的Button
查看>>
C#委托-怎样理解C#中“委托”的含义和用途
查看>>
Spring数据访问1 - 数据源配置及数据库连接池的概念
查看>>
setting.xml配置详解
查看>>
window系统下调度数据库类型资源库中的kettle job
查看>>
10、小易记单词--2017网易春招
查看>>
monkey 命令详解
查看>>
Scrapy XPath语法
查看>>
图像预处理
查看>>
16个Web开发的IDE
查看>>
Java动态代理与Cglib库
查看>>
libevent源码深度剖析一
查看>>
SSH隧道技术简介
查看>>
PAT乙级1025
查看>>
找的好网站(macdow语法,扫描二维码,)
查看>>
浏览器插件开发遇到的问题
查看>>
EF Core 1.0 和 SQLServer 2008 分页的问题
查看>>
BZOJ1798: [Ahoi2009]Seq 维护序列seq
查看>>