logging模块 

很多程序都有记录日志的需求,并且日志中包含的信息即有正常的程序访问日志,还可能有错误、警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,logging的日志可以分为 debug、info、warning、error、critical 5个级别,下面我们看一下怎么用。默认情况下日志级别为warning,只有大于warning的日志才会打印。

模块初识:

#logging初识

import logging

logging.warning("user [James] attempted wrong password more than 3 times")
logging.critical("server is down") # WARNING:root:user [James] attempted wrong password more than 3 times
# CRITICAL:root:server is down

上面的代码是最简单的方式,括号里的内容为打印的信息,logging.后的方法为日志的级别,下面看看logging五个级别的详细信息

如果想把日志写到文件里,也很简单:

#日志打印到文件中

import  logging

logging.basicConfig(filename="example.log",level=logging.INFO,
format="%(asctime)s [%(filename)s:%(lineno)d] %(message)s", datefmt="%m/%d/%Y %H:%M:%S [%A]")
# H 24小时格式 I 12小时格式 A 周几完整 a 周几简写 p AM/PM logging.debug("This message should go to the log file")
logging.info("So should this")
logging.warning("And this ,too")

logging.basicConfig里定义了输入文件路径,输入日志信息的级别,输入的格式,格式可自定义;执行完代码后example.log文件会生成信息如下:

10/31/2016 17:16:17 [Monday] So should this
10/31/2016 17:16:17 [Monday] And this ,too

其中下面这句中的level=loggin.INFO意思是,把日志纪录级别设置为INFO,也就是说,只有比日志是INFO或比INFO级别更高的日志才会被纪录到文件里,在这个例子, 第一条日志是不会被纪录的,如果希望纪录debug的日志,那把日志级别改成DEBUG就行了

如果想同时把log打印在屏幕和文件日志里,就需要了解一点复杂的知识了:

The logging library takes a modular approach and offers several categories of components: loggers, handlers, filters, and formatters.

  • Loggers expose the interface that application code directly uses.
  • Handlers send the log records (created by loggers) to the appropriate destination.
  • Filters provide a finer grained facility for determining which log records to output.
  • Formatters specify the layout of log records in the final output.
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#-Author-Lian import logging #创建logger
logger = logging.getLogger("test_log") #创建logger对象 括号内容随便写
logger.setLevel(logging.INFO) #全局日志级别 ch = logging.StreamHandler() #日志打印到屏幕上
ch.setLevel(logging.DEBUG) #指定ch日志打印级别 fh = logging.FileHandler("access.log") #日志存进文件
fh.setLevel(logging.WARNING) #指定fh日志输入级别 formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s") #定义日志格式,可写多个 #添加日志格式到ch,fh
ch.setFormatter(formatter)
fh.setFormatter(formatter) #添加ch,fh到logger中
logger.addHandler(ch)
logger.addHandler(fh) logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

全局日志级别为整个程序的底线,局部日志级别要想打印则不能比这个级别再低了

屏幕打印信息:

2016-10-31 17:23:42,988 - test_log - INFO - info message
2016-10-31 17:23:42,988 - test_log - WARNING - warn message
2016-10-31 17:23:42,988 - test_log - ERROR - error message
2016-10-31 17:23:42,988 - test_log - CRITICAL - critical message

access.log:

2016-10-31 17:02:06,223 - test_log - WARNING - warn message
2016-10-31 17:02:06,224 - test_log - ERROR - error message
2016-10-31 17:02:06,224 - test_log - CRITICAL - critical message

日志所有的格式:

重要的几个格式:%(lineno)d 输出打印日志代码行 ,%(process)d输出打印日志的进程ID ,%(thread)d输出打印日志的线程ID

日志实例:http://www.cnblogs.com/lianzhilei/p/6513230.html

生产应用(屏幕打印,日志文件写入):

import logging
from logging.handlers import RotatingFileHandler handler = RotatingFileHandler('test.log', maxBytes=20*1024*1024, backupCount=200,encoding='utf-8')
handler.setLevel(logging.INFO)
formatter = logging.Formatter('[%(asctime)s] [%(filename)s:%(lineno)d] %(levelname)s %(message)s')
handler.setFormatter(formatter)
logging.basicConfig(datefmt='%Y-%m-%d %H:%M:%S', level=logging.DEBUG)
logger = logging.getLogger()
logger.addHandler(handler) logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

生产应用(多进程下日志记录)

from cloghandler import ConcurrentRotatingFileHandler

rotateHandler = ConcurrentRotatingFileHandler(logConfig['filePath'], "a", 20 * 1024 * 1024, 200)
rotateHandler.setLevel(logging.INFO)
formatter = logging.Formatter('[%(asctime)s] [process:%(process)s] [%(filename)s:%(lineno)d] %(levelname)s %(message)s')
rotateHandler.setFormatter(formatter)
log = logging.getLogger()
log.addHandler(rotateHandler)
log.setLevel(logging.INFO)

模块安装:

pip install ConcurrentLogHandler

 

import logging

try:
11 +a
except Exception as e:
# logging.error("user [James] attempted wrong password more than 3 times")
logging.error("user [James] attempted wrong password more than 3 times",exc_info=True) # ERROR:root:user [James] attempted wrong password more than 3 times
# Traceback (most recent call last):
# File "Z:/workbanch/move_file.py", line 10, in <module>
# 11 +a
# NameError: name 'a' is not defined

  

Python开发【杂货铺】:模块logging的更多相关文章

  1. Python开发【模块】:paramiko

    一.堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作 模块安装 C:\Program Files\Python 3.5\Scri ...

  2. Python开发【模块】:Celery 分布式异步消息任务队列

    Celery 前言: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个 ...

  3. Python开发【模块】:re正则

    re模块 序言: re模块用于对python的正则表达式的操作 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行 '^' 匹配字符开头,若指定flags ...

  4. Python开发【模块】:matplotlib 绘制折线图

    matplotlib 1.安装matplotlib ① linux系统安装 # 安装matplotlib模块 $ sudo apt-get install python3-matplotlib # 如 ...

  5. Python开发【模块】:logging日志

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

  6. python标准日志模块logging及日志系统设计

    最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下. python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发 ...

  7. python标准日志模块logging的使用方法

    参考地址 最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下.python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果 ...

  8. python标准日志模块logging使用

    python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用: ...

  9. Python开发——8.模块

    一.模块 1.模块 (1)定义:一个.py文件就是一个模块 (2)原因:为了防止程序代码越来越长,对函数进行分组放到不同的文件夹里. (3)优点:提高代码的可维护性:模块编写完毕可以被别人引用,也可以 ...

  10. python的日志模块logging和syslog

    syslog模块是在unix环境下工作的模块,不能用于windows,在windows环境下可以使用logging模块. 一.syslog syslog模块可以用于记录系统运行的信息,这个模块提供的方 ...

随机推荐

  1. Spring Security笔记:Hello World

    本文演示了Spring Security的最最基本用法,二个页面(或理解成二个url),一个需要登录认证后才能访问(比如:../admin/),一个可匿名访问(比如:../welcome) 注:以下内 ...

  2. 第二十七篇:SOUI中控件属性查询方法

    SOUI项目的SVN根目录下有一个doc目录,下面有一份控件属性表.包含了大部分控件的大部分属性,不过也不一定完全准确.最保险的办法还是查源代码. SOUI对象包含控件及ISkinObj等从SObje ...

  3. bin/sh^M: bad interpreter: No such file or directory解决

    问题:bin/sh^M: bad interpreter: No such file or directory 原因:.sh脚本在windows系统下用记事本文件编写的.不同系统的编码格式引起的. 解 ...

  4. How to print 如何输出 int64_t,uint64_t的值 in C

    For int64_t type: int64_t t; printf("%"PRId64"\n", t); for uint64_t type: uint64 ...

  5. 廖雪峰js教程笔记12 用DOM更新 innerHMTL 和修改css样式

    拿到一个DOM节点后,我们可以对它进行更新. 可以直接修改节点的文本,方法有两种: 一种是修改innerHTML属性,这个方式非常强大,不但可以修改一个DOM节点的文本内容,还可以直接通过HTML片段 ...

  6. Leetcode jump Game II

    Given an array of non-negative integers, you are initially positioned at the first index of the arra ...

  7. ZeroMQ接口函数之 :zmq_getsockopt – 获取ZMQ socket的属性

    ZeroMQ API 目录 :http://www.cnblogs.com/fengbohello/p/4230135.html 本文地址 :http://www.cnblogs.com/fengbo ...

  8. <二>JDBC_通过ResultSet执行查询操作

    一.ResultSet: 结果集. 封装了使用 JDBC 进行查询的结果.  1. 调用 Statement 对象的 executeQuery(sql) 可以得到结果集. 2. ResultSet 返 ...

  9. Python In Action:二、 最小的GUI程序:麻雀虽小,五脏俱全

    Python in Action第二个例子,倒是很简单,却是最基本的GUI程序框架,里面有最基本的实现GUI流程 import wx class MyApp(wx.App): def OnInit(s ...

  10. 建设移动端web开发会涉及到的meta标签

    <meta name="format-detection" content="telephone=no"> <meta name=" ...