Python学习---8.10包的使用及loggin模块

一、包的使用

  1.什么是包

    包就是一个包含有__init__.py文件的文件夹

    包本质就是一种模块,即包是用包导入使用的,包内部包含的文件也都是用来被导入使用的

  2.为何要用包

    包的本质就是一个文件夹,那么文件夹唯一的功能就是讲文件组织起来

    随着功能越写越多,我们无法将所有功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性

    首次导入包,发生三件事

      1.以包下的__init__.py文件为基准来产生一个名称空间

      2.执行包下的__init__.py文件的代码,将执行过程中产生的名字都丢到名称空间中

      3.在当前执行文件中拿到一个名字p1,该p1就是指向__init__.py名称空间的

  3.注意

    在python2中,包下必须有一个__init__.py,而python3中即便是没有也不会报错

    但凡是在导入语句中带点的,点的左边都必须是一个包

    导入包就是在导包下的__init__.py文件

    如果使用绝对导入,绝对导入的起始位置都是以包的顶级目录为起始点

    但是包内部模块的导入通常应该使用相对导入,用.代表当前所在的文件夹(而非执行文件),..代表上一级

    强调:

      相对导入只能包内部的模块之间互相导入

      ..上一级不能超出顶级包

二、logging模块

    1.日志级别

CRITICAL=50
ERROR=40
WARNING=30  #默认级别
INFO=20
DEBUG=10
NOTEST=0

    2.logging模块指定全局配置,针对所有logger有效,控制打印到文件中

#======介绍
可在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有
filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。
filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
format:指定handler使用的日志显示格式。
datefmt:指定日期时间格式。
level:设置rootlogger(后边会讲解具体概念)的日志级别
stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(filename)s 调用日志输出函数的模块的文件名
%(module)s 调用日志输出函数的模块名
%(funcName)s 调用日志输出函数的函数名
%(lineno)d 调用日志输出函数的语句所在的代码行
%(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d 线程ID。可能没有
%(threadName)s 线程名。可能没有
%(process)d 进程ID。可能没有
%(message)s用户输出的消息

#========使用
import logging
logging.basicConfig(filename=‘access.log‘,
                    format=‘%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s‘,
                    datefmt=‘%Y-%m-%d %H:%M:%S %p‘,
                    level=10)

logging.debug(‘调试debug‘)
logging.info(‘消息info‘)
logging.warning(‘警告warn‘)
logging.error(‘错误error‘)
logging.critical(‘严重critical‘)

#========结果
access.log内容:
2017-07-28 20:32:17 PM - root - DEBUG -test:  调试debug
2017-07-28 20:32:17 PM - root - INFO -test:  消息info
2017-07-28 20:32:17 PM - root - WARNING -test:  警告warn
2017-07-28 20:32:17 PM - root - ERROR -test:  错误error
2017-07-28 20:32:17 PM - root - CRITICAL -test:  严重critical

part2: 可以为logging模块指定模块级的配置,即所有logger的配置

    3.logging模块的Formatter,Handler,Logger,Filter对象

       logger:产生日志的对象

       Filter:过滤日志的对象

       Handler:接受日志然后控制打印不到不同的地方,FileHandler用来打印到文件中,Streamhandler用来打印到终端

       Formatter:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式

      

‘‘‘
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‘)

    4.Logger与Handler的级别

      logger是第一级过滤,然后才能到handler,在为这两项设置级别的时候,最好设置同级别。

原文地址:https://www.cnblogs.com/Liu-guang-hui/p/9456444.html

时间: 2024-11-08 20:56:24

Python学习---8.10包的使用及loggin模块的相关文章

Python学习第三天(一个简单制作导入模块)

Python一个简单的模块制作和导入 一个简单的模块 [[email protected] python]# cat my.py name = 'I am wuang!' 导入模块 >>> import my >>> print my.name I am wuang! 直接导入模块属性名字 >>> from my import name >>> print name I am wuang!

Python学习第10天

事件驱动 简而言之,事件驱动分为二个部分:第一,注册事件:第二,触发事件. 自定义事件驱动框架 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 #!/usr/bin/env python 4 # -*- coding:utf-8 -*- 5 6 # event_drive.py 7 event_list = [] 8 def run(): 9 for event in event_list: 10 obj = event() 11 obj.e

Python学习:10.Python装饰器讲解(一)

情景介绍 一天,在你正在努力加班的时候,老板给交给你了一个任务,就是在这段代码里将所有函数开始输出一个'hello'最后输出当前时间,再输出一个"end",这段代码里包含了大量的函数,你会怎么做? def f1(): print('proces a') def f2(): print('proces b') def f3(): print('proces c') def f4(): print('proces d') ... ... 刚拿到这个任务,我们可能想着这样做,在每个函数中添加

从零开始的Python学习Episode 10——函数

函数 一.函数的创建 简单格式 def function_name(参数表): 函数体 return 如果没有写return,函数会默认返回一个none 二.函数的参数 必需参数: 调用函数时必需参数须以正确的顺序传入,调用的数量必须和声明时的一样. def func1(name,age): print('my name is %s,i am %d years old'%(name,age)) func1('smilepup',20) #输出my name is smilepup,i am 20

python学习笔记10:python操作数据库(mysql、redis)

一.python操作mysql数据库 python3中操作mysql数据需要安装一个第三方模块,pymysql,使用 pip install pymysql 安装即可 二.python操作redis redis是一个nosql类型的数据库,数据都存在内存中,有很快的读写速度 python3中操作reids需要安装一个第三方模块,redis,使用 pip install redis 安装即可

python学习笔记10(用户交互程序)

注释 单行:# 多行:上下各用3个连续单引号或双引号 3个引号除了多行注释,还可以打印多行 举例: msg = name = (name) (msg) 运行结果第二个print就是打印3行字符串. 如果单行,用引号即可:msg = "Alex Li" python中,单引号和双引号相同,除了单套双或双套单. 例:msg = "I'm Alex Li" 用户输入 举例:  = () password = () (,password) 格式化输出 %s(string),

Python学习(10)元组

目录 Python 元组 访问元组 修改元组 删除元组 元组运算符 元组索引,截取 无关闭分隔符 元组内置函数 Python 元组 Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可. 如下实例: 创建空元组 tup1 = (); 元组中只包含一个元素时,需要在元素后面添加逗号 tup1 = (50,); 元组与字符串类似,下标索引从0开始,可以进行截取,组合等. 访问元组 元组可以使用下标

Python学习笔记10

? 1.函数式编程 ? 理论就来自lambda演算,虽然没有学过lisp,一直被其大名震撼. 特性: 函数是以一等公民 可以作为参数 可以作为返回值 具有闭包特性 ? 1.1参数传递方式 一般参数传递:值传递,引用传递 命名参数传递,使用"参数名=值"的格式,Python内成为关键字参数(keyword argument) 默认参数设置 可变参数,使用*开头,被解析成为一个元组 可变参数,使用**开头,被解析成为一个字典,必须使用关键字参数的方式 在调用的时候如何加上*,则会被解成元组

Python学习笔记10—几个名词概念

循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如,while 语句. 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项.比如,for 语句. 递归(recursion),指的是一个函数不断调用自身的行为.比如,以编程方式输出著名的斐波纳契数列. 遍历(traversal),指的是按照一定的规则访问树形结构中的每个节点,而且每个节点都只访问一次. 迭代 我们常常将哪些能够用诸如循环语句之类的方法来一个一个读取元素的对象,就称之为可迭代的对象.那么用来循环的如 f