logging模块详解以及常见代码
1.在django中获取客户端IP地址:
if 'HTTP_X_FORWARDED_FOR' in request.META:
ip = request.META['HTTP_X_FORWARDED_FOR']
else:
ip = request.META['REMOTE_ADDR']
2.logging模块日志级别:
DEBUG:最详细的日志信息,典型应用场景是问题诊断;
INFO:信息详细程度仅次于DEBUG,通常只记录关键节点信息;
WARNING:当某些不期望的事情发生时记录的信息,
如:磁盘可用空间较低,但是此时应用程序还是正常运行的;
ERROR:由于一个更严重的问题导致某些功能不能正常运行时记录的信息;
CRITICAL:当发生严重错误,导致应用程序不能继续运行时记录的信息.
应用上线或部署生产环境时,应该使用WARNING或ERROR或CRITICAL级别的
日志来降低机器的I/O压力和提高获取错误日志信息的效率.
3.logging模块提供了两种记录日志的方式:
第一种方式是使用logging提供的模块级别的函数;
第二种方式是使用Logging日志系统的四大组件.
4.模块级别的常见代码:
import logging
LOG_FORMAT = "%(asctime)s %(levelname)s %(pathname)s %(message)s "#配置输出日志格式
DATE_FORMAT = '%Y-%m-%d %H:%M:%S %a ' #配置输出时间的格式,注意月份和天数不要搞乱了
logging.basicConfig(level=logging.DEBUG,
format=LOG_FORMAT,
datefmt = DATE_FORMAT ,
filename=r"d:\test\test.log"
)
logging.debug("msg1")
logging.info("msg2")
logging.warning("msg3")
logging.error("msg4")
logging.critical("msg5")
5.日志流处理--常见代码:
def set_log(level, filename='minic_down.log',filedir='/data/update/'):
log_file = os.path.join(filedir, filename) if not os.path.isdir(filedir):
os.makedirs(filedir)
if not os.path.isfile(log_file):
os.mknod(log_file) log_level_total = {'debug': logging.DEBUG, 'info': logging.INFO, 'warning': logging.WARN, 'error': logging.ERROR,
'critical': logging.CRITICAL}
logger_f = logging.getLogger()
logger_f.setLevel(logging.DEBUG) fh = logging.FileHandler(log_file)
fh.setLevel(log_level_total.get(level, logging.DEBUG))
formatter = logging.Formatter('%(asctime)s - %(filename)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter) logger_f.addHandler(fh)
return logger_f # 日志记录器
logger = set_log('debug')
6.说明
Logger类:
1.向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息;
2.将日志消息传送给所有感兴趣的日志handlers.
我们通常用logging.getLogger()方法创建一个Logger类的实例,
有一个可选参数name,该参数表示将要返回的日志器的名称标识,
如果不提供该参数,则其值为'root'.
注意不能创建多个logger,否则会出现重复输出日志现象,
Logger.setLevel():设置日志器处理日志消息的最低严重级.
Handler类:
Handler对象的作用是(基于日志消息的level)将消息分发到handler指定的位置(文件、网络、邮件等).
Logger对象可以通过addHandler()方法为自己添加0个或者更多个handler对象.
比如一个应用程序可能想要实现以下几个日志需求:
1.把所有日志都发送到一个日志文件中;
2.把所有严重级别大于等于error的日志发送到stdout(标准输出);
3.把所有严重级别为critical的日志发送到一个email邮件地址.这种场景就需要3个不同的handlers,
每个handler负责发送一个特定级别的日志到一个特定的位置.
Handler.setLevel():指定被处理的信息级别,低于lel级别的信息将被忽略;
Handler.setFormatter():给这个handler选择一个格式.
logging.StreamHandler--将日志消息发送到输出到Stream
logging.FileHandler--将日志消息发送到磁盘文件
7.日志流处理简要流程:
1.创建一个logger
2.设置下logger的日志的等级
3.创建合适的Handler(FileHandler要有路径)
4.设置下每个Handler的日志等级
5.创建下日志的格式
6.向Handler中添加上面创建的格式
7.将上面创建的Handler添加到logger中
8.打印输出logger.warning\logger.error\logger.critical
如果出现重复写日志,则使用前先判断是否有相同的handler对象
如果logger.handlers列表为空,则添加;否则,直接去写日志
def my_logger(logger_name):
logger = logging.getLogger(logger_name)
logger.setLevel(logging.INFO)
if not logger.handlers:
fh = logging.FileHandler('hehe.log')
formatter = logging.Formatter(
'%(asctime)s - %(name)s - %(levelname)s - %(message)s ')
fh.setFormatter(formatter) logger.addHandler(fh) return logger
8.捕获 Traceback
try:
result = 10 / 0
except Exception:
logger.error('Faild to get result', exc_info=True)
logger.info('Finished')
参考地址:https://cuiqingcai.com/6080.html
参考地址:https://www.cnblogs.com/liujiacai/p/7804848.html
参考地址:https://www.cnblogs.com/Nicholas0707/p/9021672.html
logging模块详解以及常见代码的更多相关文章
- Python的logging模块详解
Python的logging模块详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志级别 日志级别指的是产生的日志的事件的严重程度. 设置一个级别后,严重程度 ...
- python logging模块详解[转]
一.简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.war ...
- Python logging模块详解
简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.warni ...
- Python自学笔记-logging模块详解
简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.warni ...
- [转载]Python logging模块详解
原文地址: http://blog.csdn.net/zyz511919766/article/details/25136485 简单将日志打印到屏幕: import logging logging. ...
- Python同时向控制台和文件输出日志logging的方法 Python logging模块详解
Python同时向控制台和文件输出日志logging的方法http://www.jb51.net/article/66756.htm 1 #-*- coding:utf-8 -*- 2 import ...
- (转)python collections模块详解
python collections模块详解 原文:http://www.cnblogs.com/dahu-daqing/p/7040490.html 1.模块简介 collections包含了一些特 ...
- python之OS模块详解
python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
随机推荐
- thinkphp5开发restful-api接口学习 教程视频 接口文档
目录 1. 获取验证码 2. 用户注册 3. 用户登录 4. 用户上传头像 5. 用户修改密码 6. 用户找回密码 7. 用户绑定手机号 8. 用户绑定邮箱 9. 用户绑定用户名(手机/邮箱) 10. ...
- GoF23种设计模式之行为型模式之状态模式
一.概述 定义对象之间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 二.适用性 1.一个对象的行为取决于它的状态,并且它必须在运行时刻 ...
- 谈谈你对Hibernate的理解
答: 1. 面向对象设计的软件内部运行过程可以理解成就是在不断创建各种新对象.建立对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,不管程序运行的过程和操作怎么样,本质上都是要得到一 ...
- SQL_3_表达式、条件语句与运算
加号的两种用法: 1.在SELECT子句中使用+号以执行对数据的运算并将结果显示出来. SELECT ITEM WHOLESALE WHOLESALE+0.15 FROM PRICE; 还可以重命名新 ...
- session工作原理
什么是Sesson? 这个是状态保持三大对象之一! 原意是会话,会议的意思! 就是你打开浏览器到关闭浏览器 这期间称为一个会话,也就是一个session, 它是保存在服务器端的. 每当客户端请求页面时 ...
- BZOJ 3351: [ioi2009]Regions
对于一个询问(x,y)对y出现次数分类,若<=lim,在儿子处统计答案,若>lim则y的种类肯定<lim,在祖先处统计(仿佛要去重?但是没去重也过了,那个时限仿佛怎么做都能过) #i ...
- BNU 3692 I18n 模拟
题意: 在一篇文章中,单词可以缩写.例如单词Internationalization可以缩写为I18n,缩写的两端是原单词的首尾字母,中间的数字是被省略的字母的个数. 现在给你一篇缩写的文章,输出展开 ...
- virtual 三种用法
virtual用法一 #include using namespace std;class A{public: virtual void display(){ cout<<& ...
- MongoDB学习-->设置通用的自增ID替代ObjectId
插入mongodb数据时,会为其分配一个随机id,想要设置通用的自增id,可以进行以下操作 1.创建自增序列 package com.tangzhe.autoid; import lombok.Dat ...
- day18-socket 编程
1.Socket是网络上的使用的交互信息得方法,也叫套接字 用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 通讯原理 Soc ...