实战篇

 import logging
import logging.handlers LOG_PATH = r'./' def logConfig_1():
'''
配置 log 输出到文件 : fileName 中
'''
fileName = LOG_PATH + r"\%s.txt"%getlogname()
#print(lfname)
logformat='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s'
logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
filename=fileName,
filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
#a是追加模式,默认如果不写的话,就是追加模式
format=logformat
#日志格式
)
print('logConfig_2配置完成')
#logConfig_1()#配置log def logConfig_2():
'''
配置 log 输出到文件 和 控制台:
即 需要2个处理器:
1-输出到文件
2-输出到控制台
'''
logfilename = LOG_PATH + r"\%s.txt"%getlogname()
logformat_1='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s' #获取日志器 Logger ,并取名 'mylogger'
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)#统一设置log打印级别
logger.handler = [] #创建处理器 Handler:fileHandler、streamHandler
fileHandler = logging.FileHandler(logfilename)#输出到文件
fileHandler.setFormatter(logging.Formatter(logformat_1)) streamHandler = logging.StreamHandler()#输出到控制台
streamHandler.setLevel(logging.ERROR)#可单独对handler设置log打印级别
logformat_2=' %(name)s-%(asctime)s - %(module)s-%(funcName)s[line:%(lineno)d] - %(levelname)s: %(message)s'
streamHandler.setFormatter(logging.Formatter(logformat_2)) #将处理器添加到日志器中
logger.addHandler(fileHandler)
logger.addHandler(streamHandler) print('logConfig_2配置完成')
return logger
#全局变量
logger = logConfig_2()#配置log,在其他模块中引用的时候直接运用logger,不能再次创建 def getlogname():
logfilename = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
return logfilename if __name__ == '__main__':
#logging.debug('debug message %s - %d ......','hello', 1) logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message')

其他模块中引用:

 import logging
import loggingtest1
from logConfig import * #logger = logConfig_2() #不能重新获取,否则会多次打印
logger.debug('debug message')
logger.info('info message')
logger.warning('warning message')
logger.error('error message')
logger.critical('critical message') loggingtest1.test()
 import logging
from logConfig import * #logger = logConfig_2() #同样不能调用该函数,否则会重复打印,调用n
次打印+n次 def test():
flag = 'test1-test'
logger.debug('debug message%s',flag)
logger.info('info message%s',flag)
logger.warning('warning message%s',flag)
logger.error('error message%s',flag)
logger.critical('critical message%s',flag)

注意:不能多次创建处理器(handler),否则会打印+n次,解决办法就是定义全局变量,使用同一个logger去打印

Python之日志处理(logging模块二实战)的更多相关文章

  1. Python之日志处理 logging模块

    Python之日志处理(logging模块)   本节内容 日志相关概念 logging模块简介 使用logging提供的模块级别的函数记录日志 logging模块日志流处理流程 使用logging四 ...

  2. Python的日志记录-logging模块的使用

    一.日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法,软件开发者在代码中调用日志函数,表明发生了特定的事件,事件由描述性消息描述,同时还包含事件的重要性,重要性也称为级别或严重性. ...

  3. Python日志输出——logging模块

    Python日志输出——logging模块 标签: loggingpythonimportmodulelog4j 2012-03-06 00:18 31605人阅读 评论(8) 收藏 举报 分类: P ...

  4. python基础学习十 logging模块详细使用【转载】

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...

  5. Python进阶(十一)----包,logging模块

    Python进阶(十一)----包,logging模块 一丶包的使用 什么是包: ​ 包是通过使用 .模块名的方式组织python模块名称空间的方式. 通俗来说,含有一个__init__.py文件的文 ...

  6. Python 入门之 内置模块 --logging模块

    Python 入门之 内置模块 --logging模块 1.logging -- 日志 (1)日志的作用: <1> 记录用户信息 <2> 记录个人流水 <3> 记录 ...

  7. python日志记录-logging模块

    1.logging模块日志级别 使用logging模块简单示例: >>>import logging >>>logging.debug("this's a ...

  8. Python模块:日志输出—logging模块

    1. logging介绍 Python的logging模块提供了通用的日志系统,可以方便第三方模块或者是应用使用.这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP GET/ ...

  9. Python中的日志管理Logging模块

    1.基本的用法 import logging logging.debug('This is debug message') logging.info('This is info message') l ...

随机推荐

  1. SQL SERVER 性能优化二: 数据库初始值大小及增长方式设置

    数据库增长方式主要有两种,按百分比自动增长和按固定大小自动增长,设置初始大小和增长方式需谨慎. 初始大小就是建库的大小,设小了,容易造成磁盘碎片,频繁增长也会影响IO响应.设大了,也不行,设大了,每次 ...

  2. elementUI字体图标不显示问题

    原文链接: 点我 自己搭建的Vue项目,没有使用vue-cli,引入elementUI时提示字体图标404,找不到文件,如下错误: GET http://localhost:9090/WEB-INF/ ...

  3. Ajax各参数介绍及使用

    Ajax各参数介绍及使用 1. url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2. type: 要求为String类型的参数,请求方式(post或get)默认为get. ...

  4. jquery 根据后端传过来的value值,让小原点根据不同值区间去左右定位

    /** * 小圆点滑动 * @param {目标dom} barEle * @param {最小值} min * @param {最大值} max * @param {dom总长度} domLang ...

  5. VUE生命周期中的钩子函数及父子组件的执行顺序

    先附一张官网上的vue实例的生命周期图,每个Vue实例在被创建的时候都需要经过一系列的初始化过程,例如需要设置数据监听,编译模板,将实例挂载到DOM并在数据变化时更新DOM等.同时在这个过程中也会运行 ...

  6. SpringBoot + MybatisPlus3.x 代码生成

    主要参考另外两篇博文,这里表示感谢 参考一(mybatisplus3.x分页) : https://www.jianshu.com/p/2ec9337dc2b0 参考二(mybatisplus2.x升 ...

  7. vue 搭建框架到安装插件依赖,Element、axios、qs等

    一.使用vue 单页面开发,首先要安装好本地环境 步骤如下: 1 下载nodejs 安装 (此时npm 和 node环境都已经装好)2 安装淘宝镜像 npm install -g cnpm --reg ...

  8. STM32 Cube之旅-尝试新的开发方式

    尝试使用Cube进行一些开发学习,这里对此做一个梗概,先有一个全面的了解. 文章目录 Cube全家桶 CubeMX CubeIDE CubeProg 结语 Cube全家桶 曾几何时,ST刚推出Cube ...

  9. Java并发编程实战 04死锁了怎么办?

    Java并发编程文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 Java并发编程实战 03互斥锁 解决原子性问题 前提 在第三篇 ...

  10. uCOS2014.1.11(转载)(void*)0 的理解

    一般把(void*)0定义为NULL表示这是个空指针void的含义void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据.众所周知,如果指针p1和p2的类型 ...