目录

  1. 1、日志输出到文件
  2. 2、日志输出到屏幕
  3. 3、设置输出等级
  4. 4、设置多个日志输出对象
  5. 5、日志的配置
  6. 6、记录异常
  7. 7、设置日志输出样式

  

1、日志输出到文件
basicConfig()提供了非常便捷的方式让你配置logging模块并马上开始使用。
什么都不配置直接使用默认值在控制台中打log,用这样的方式替换print语句对日后项目维护会有很大帮助。
但是如果设置了filename,输出到文件,就不会再在屏幕上打印。

例子1.1

  1. import logging
  2.  
  3. logging.basicConfig(filename='example.log', level=logging.DEBUG)
  4. logging.debug('This message should go to the log file')

  

当前目录下会生成example.log文件,其中有如下内容:
DEBUG:root:This message should go to the log file

2、日志输出到屏幕
例子2.1

  1. import logging
  2.  
  3. logging.basicConfig(level=logging.DEBUG)
  4. logging.debug('This message should go to the log file')

  

屏幕输出:
DEBUG:root:This message should go to the log file

3、设置输出等级
默认情况下,logging将日志打印到屏幕,日志级别默认为WARNING,低于该级别的日志将不被打印。
日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。
日志优先级分为:
debug : 10
info : 20
warning : 30
error : 40
basicConfig()中level=logging.INFO是为所有日志对象设置初始级别。例子3.1——对logging设置等级
可通过logger.setLevel(logging.DEBUG)为个体日志对象设定级别。例子3.2——对logger设置等级

例子3.1——对logging设置等级

  1. import logging
  2.  
  3. logging.basicConfig(level=logging.INFO)
  4. # start reading database
  5. logging.info('Start reading database')
  6. # update records here
  7. logging.info('Finish updating records')

  

屏幕输出:
INFO:__main__:Start reading database
INFO:__main__:Finish updating records

例子3.2——对logger设置等级

  1. import logging
  2.  
  3. logging.basicConfig(level=logging.INFO)#必须有初始等级
  4.  
  5. logger1 = logging.getLogger('log1')
  6. logger1.setLevel(logging.INFO)
  7. # Start reading database
  8. logger1.info('Start reading database')
  9. # update records here
  10. logger1.info('Finish updating records')
  11.  
  12. logger2 = logging.getLogger('log2')
  13. logger2.setLevel(logging.DEBUG)
  14. # Start reading database
  15. logger2.info('Start reading database')
  16. logger2.debug('666')
  17. # update records here
  18. logger2.info('Finish updating records')

  

屏幕输出:
INFO:log1:Start reading database
INFO:log1:Finish updating records
INFO:log2:Start reading database
DEBUG:log2:666
INFO:log2:Finish updating records

4、设置多个日志输出对象

  1. import logging
  2.  
  3. logging.basicConfig(level=logging.INFO)
  4. # 获取logger实例,如果参数为空则返回root
  5. logger1 = logging.getLogger('log1')
  6. # Start reading database
  7. logger1.info('Start reading database')
  8. # update records here
  9. logger1.info('Finish updating records')
  10.  
  11. logger2 = logging.getLogger('log2')
  12. logger2.setLevel(logging.DEBUG)
  13. # Start reading database
  14. logger2.info('Start reading database')
  15. logger2.debug('666')
  16. # update records here
  17. logger2.info('Finish updating records')

  

屏幕输出:
INFO:log1:Start reading database
INFO:log1:Finish updating records
INFO:log2:Start reading database
DEBUG:log2:666
INFO:log2:Finish updating records

5、日志的配置
作为开发者,我们可以通过以下3中方式来配置logging:
1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数;
2)创建一个日志配置文件,然后使用fileConfig()函数来读取该文件的内容;
3)创建一个包含配置信息的dict,然后把它传递个dictConfig()函数;

参考
http://python.jobbole.com/81666/
https://www.cnblogs.com/wswang/p/6138304.html
http://www.jb51.net/article/114316.htm

6、记录异常

  1. try:
  2. 1 / 0
  3. except:
  4. # 等同于error级别,但是会额外记录当前抛出的异常堆栈信息
  5. logger.exception('this is an exception message')

  

7、设置日志输出样式
fmt中允许使用的变量可以参考下表。

%(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 用户输出的消息

例子7.1——对logging设置日志输出样式

  1. import logging
  2. import time
  3.  
  4. # 日志初始配置:写入日志文件
  5. logging.basicConfig(
  6. level=logging.DEBUG, # 设置写入级别。日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET
  7. # 设置写入样式。'2018-01-12 13:09:02|mytest.py|<module>|line:9|INFO|start runing'
  8. format='%(asctime)s|%(filename)s|%(funcName)s|line:%(lineno)d|%(levelname)s|%(message)s',
  9. datefmt='%Y-%m-%d %X',
  10. filename=time.strftime("%Y%m%d") + '.log' # 写入文件位置和文件名
  11. )
  12.  
  13. # 控制台打印输出日志
  14. console = logging.StreamHandler() # 定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象
  15. formatter = logging.Formatter(fmt='%(asctime)s|%(name)-8s: %(levelname)-8s| %(message)s',datefmt='%Y-%m-%d %H:%M:%S') # 控制台输出样式
  16. console.setFormatter(formatter)
  17. logging.getLogger('').addHandler(console)
  18. console.setLevel(logging.INFO) # 设置要打印日志的等级,低于这一等级,不会打印
  19.  
  20. # 定义日志内容(用于写入日志文件和控制台的打印)
  21. logging.critical('CRITICAL le') # 定义严重日志内容
  22. logging.error('error le') # 定义错误日志内容
  23. try:
  24. 1 / 0
  25. except Exception as e:
  26. logging.warning('exception: %s', e) # 定义警告日志内容
  27. logging.info('start runing') # 定义消息日志内容
  28. logging.info('login done')
  29. str1 = 'lalala'
  30. logging.debug("\n%s\n", str1) # 定义调试日志内容

  

控制台输出:
2018-02-09 14:12:31|root : CRITICAL| CRITICAL le
2018-02-09 14:12:31|root : ERROR | error le
2018-02-09 14:12:31|root : WARNING | exception: division by zero
2018-02-09 14:12:31|root : INFO | start runing
2018-02-09 14:12:31|root : INFO | login done
日志文件写入:
2018-02-09 14:11:30|004-日志简单使用.py|<module>|line:21|CRITICAL|CRITICAL le
2018-02-09 14:11:30|004-日志简单使用.py|<module>|line:22|ERROR|error le
2018-02-09 14:11:30|004-日志简单使用.py|<module>|line:26|WARNING|exception: division by zero
2018-02-09 14:11:30|004-日志简单使用.py|<module>|line:27|INFO|start runing
2018-02-09 14:11:30|004-日志简单使用.py|<module>|line:28|INFO|login done
2018-02-09 14:11:30|004-日志简单使用.py|<module>|line:30|DEBUG|
lalala

例子7.2——对logger实例设置日志输出样式

  1. import logging
  2. import sys
  3.  
  4. # 获取logger实例,如果参数为空则返回root logger
  5. logger = logging.getLogger("AppName")
  6.  
  7. # 指定logger输出格式
  8. formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
  9.  
  10. # 文件日志
  11. file_handler = logging.FileHandler("test.log")#创建文件的日志处理器
  12. file_handler.setFormatter(formatter) # 可以通过setFormatter指定输出格式
  13.  
  14. # 控制台日志
  15. console_handler = logging.StreamHandler(sys.stdout)#创建控制台的日志处理器
  16. console_handler.formatter = formatter # 也可以直接给formatter赋值
  17.  
  18. # 为logger添加的日志处理器
  19. logger.addHandler(file_handler)
  20. logger.addHandler(console_handler)
  21.  
  22. # 指定日志的最低输出级别,默认为WARN级别
  23. logger.setLevel(logging.INFO)
  24.  
  25. # 输出不同级别的log
  26. logger.debug('this is debug info')
  27. logger.info('this is information')
  28. logger.warning('this is warning message')
  29. logger.error('this is error message')
  30. logger.fatal('this is fatal message, it is same as logger.critical')
  31. logger.critical('this is critical message')

  

屏幕输出:(也是日志文件写入)
2018-02-09 14:00:22,857 INFO : this is information
2018-02-09 14:00:22,857 WARNING : this is warning message
2018-02-09 14:00:22,857 ERROR : this is error message
2018-02-09 14:00:22,857 CRITICAL: this is fatal message, it is same as logger.critical
2018-02-09 14:00:22,857 CRITICAL: this is critical message

延伸:

系统日志参考

https://www.jianshu.com/p/abb6148c15b4

日志汇总:logging、logger的更多相关文章

  1. 【python】【logging】python日志模块logging常用功能

    logging模块:应用程序的灵活事件日志系统,可以打印并自定义日志内容 logging.getLogger 创建一个log对象 >>> log1=logging.getLogger ...

  2. Java程序日志:java.util.logging.Logger类

    一.Logger 的级别 比log4j的级别详细,全部定义在java.util.logging.Level里面.各级别按降序排列如下:SEVERE(最高值)WARNINGINFOCONFIGFINEF ...

  3. Java日志工具之java.util.logging.Logger

    今天总结下JDK自带的日志工具Logger,虽然它一直默默无闻,但有时使用它却比较方便.更详细的信息可以查看JDK API手册,本文只是简单示例入门. 创建Logger 我们可以使用Logger的工厂 ...

  4. 通配置文件的方式控制java.util.logging.Logger日志输出

    转自:http://zochen.iteye.com/blog/616151 简单的实现了下利用JDK中类java.util.logging.Logger来记录日志.主要在于仿照log4j方式用配置文 ...

  5. Java日志组件1---Jdk自带Logger(java.util.logging.Logger)

    最近在看日志的一些东西,发现利用JDK自带的log也可以简单的实现日志的输出,将日志写入文件的过程记录如下: 1.新建LogUtil.Java( 里面写了几个静态方法,为log设置等级.添加log控制 ...

  6. 【java】java自带的java.util.logging.Logger日志功能

    偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logg ...

  7. Java日志介绍(1)-java.util.logging.Logger

    java.util.logging.Logger是JDK自带的日志工具,其简单实现了日志的功能,不是很完善,所以在实际应用中使用的比较少.本文直接用代码演示其使用方法,文中所使用到的软件版本:Java ...

  8. 日志模块logging使用心得

    在应用程序使用中,日志输出对应用维护人员.开发人员判断程序的问题起重要作用. 那么在python中如何定义程序的日志输出? 推荐使用日志模块logging 需求:实现日志内容输出在文件中和控制器中 i ...

  9. java.util.logging.Logger 使用详解

    概述: 第1部分 创建Logger对象 第2部分 日志级别 第3部分 Handler 第4部分 Formatter 第5部分 自定义 第6部分 Logger的层次关系 参考 第1部分 创建Logger ...

随机推荐

  1. angular ajax的使用及controller与service分层

    一个简单的例子,控制层:.controller('publishController',['$scope','publishService', function($scope,publishServi ...

  2. ReSharper插件功能介绍

    ReSharper是一款功能非常强悍的Visual Studio的辅助插件,这款插件可用于C#,VB.net,XML,Asp.net,XAML,和构建脚本.ReSharper 9.1版本大改进对 Ja ...

  3. php 在windows下配置虚拟目录的方法

    1.先找到apache的配置文件 httpd.conf 找如如下代码: # Virtual hosts#Include conf/extra/httpd-vhosts.conf 把# Include ...

  4. LeetCode——Binary Tree Preorder Traversal

    Given a binary tree, return the preorder traversal of its nodes' values. For example: Given binary t ...

  5. sublime常用插件及配置

      以下是我的sublime插件列表: Side​Bar​Enhancements增强版侧边栏 这个插件官方不支持通过package安装了,只能手动了,下载地址https://github.com/S ...

  6. Access数据操作-01

    1.未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序 在菜单 “项目”的最下面 工程属性  菜单,选择“生成”选项卡,将目标平台由“Amy CPU”或者“*64”改成“* ...

  7. 十分钟理解Java中的动态代理

    十分钟理解 Java 中的动态代理   一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...

  8. php应该在何时调用mysql_close() ,可能和中断请求有关

    关于php应该在何时调用mysql_close()以及pconnect方式和传统方式有何种区别收藏 以前我一直认为,当php的页面执行结束时,会自动释放掉一切.相信很多人都跟我想的一样.但事实证明并不 ...

  9. 【Mysql】 case ... when ... 用法

    sql语句查询时给某个空字段赋值 SELECT CASE WHEN field= '' THEN ' WHEN fieldIS NULL THEN ' ELSE field END FROM tabl ...

  10. Hadoop DBOutputFormat的使用

    最近在研究数据在HDFS和关系型数据库之间的迁移,主要使用了两种方式:一是,按照数据库要求的文件格式生成文件,然后由数据库提供的导入工具进行导入:二是采用JDBC的方式进行导入.MapReduce默认 ...