内容简介:[TOC]
python & django logging 小结
[TOC]
python
基本
一次配置,多处生效
import logging
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')
>>>12/12/2010 11:46:36 AM is when this event was logged.
高级
-
log_record
filters会用到,一个和log信息有关的对象
-
loggers
接口,被应用层(我们开发者)调用的
-
handlers
写文件的,挂在logger上
-
filters
过滤文本的, 可以给logger用,也可以给handler用
-
formatters
定义log的格式, 给handler用
formatter
-
fmt
message的格式
-
datefmt
时间格式
-
style
分隔符
- %(asctime)s - %(levelname)s - %(message)s
- &(asctime)s - &(levelname)s - &(message)s
例子
my_formater = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p', style='%')
详细参数
源码里面有,也可以看文档
filter
- 返回True或者False
- False将会被过滤
- 可以是一个类,也可以是函数.
- 建议用类的形式, 因为带name,将来想remove filter更方便
-
Filter类长这样
class Filter(object): def __init__(self, name=''): self.name = name self.nlen = len(name) def filter(self, record): return True -
函数
def my_filter(record): return False
handler
- logging模块提供了很多handler.
-
logging.StreamHandler(sys.stdout)和logging.RotatingFileHandler常见 -
handler.addFilter() -
handler.setFormatter() -
my_handler.setLevel()
logger
-
定义logger
logger = logging.getLogger('666') -
set level
logger.setLevel(logging.DEBUG)
- logger.addFilter()
- logger.addHandler()
- logger.info('message')
例子
import logging
logger = logging.getLogger('spam_application')
logger.setLevel(logging.DEBUG)
my_handler = logging.StreamHandler()
my_handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
my_handler.setFormatter(formatter)
logger.addHandler(my_handler)
logger.info('creating an instance of auxiliary_module.Auxiliary')
>>> 2019-07-03 16:02:30,952 - spam_application - INFO - creating an instance of auxiliary_module.Auxiliary
my_filter = lambda record: True
my_handler.addFilter(my_filter)
logger.info('creating an instance of auxiliary_module.Auxiliary')
>>> 2019-07-03 16:03:06,858 - spam_application - INFO - creating an instance of auxiliary_module.Auxiliary
my_filter = lambda record: False
my_handler.addFilter(my_filter)
logger.info('creating an instance of auxiliary_module.Auxiliary')
配置日志记录
三种方式
- 像上面用方法配置
-
dict
LOGGING = { 'version': 1, 'disable_existing_loggers': True, 'formatters': { 'standard': { 'format': '[%(asctime)s][%(filename)s] - %(funcName)s[line:%(lineno)d] - [%(levelname)s]: %(message)s' }, }, 'filters': { }, 'handlers': { 'security_log': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(cf['log']['path'], 'security_log.log'), 'maxBytes': 1024 * 1024 * 10, 'backupCount': 10, 'formatter': 'standard', }, 'event_log': { 'level': 'DEBUG', 'class': 'logging.handlers.RotatingFileHandler', 'filename': os.path.join(cf['log']['path'], 'event_log.log'), 'maxBytes': 1024 * 1024 * 10, 'backupCount': 10, 'formatter': 'standard', }, 'console': { 'level': 'ERROR', 'class': 'logging.StreamHandler', 'formatter': 'standard' }, }, 'loggers': { 'eventLog': { 'handlers': ['event_log', 'console'], 'level': 'DEBUG', 'propagate': False }, 'security': { 'handlers': ['security_log', 'console', 'security_db'], 'level': 'DEBUG', 'propagate': False }, 'system': { 'handlers': ['system_log', 'console', 'system_db'], 'level': 'DEBUG', 'propagate': False }, } } -
file
略
django
django默认使用dict方式.
logging_settings == settings.LOGGING
logging_config == logging.config.dictConfig
def configure_logging(logging_config, logging_settings):
if logging_config:
# First find the logging configuration function ...
logging_config_func = import_string(logging_config)
logging.config.dictConfig(DEFAULT_LOGGING)
# ... then invoke it with the logging settings
if logging_settings:
logging_config_func(logging_settings)
例子
理想情况下,如果在settings中配置了LOGGING,直接使用即可.
# import the logging library
import logging
# Get an instance of a logger
logger = logging.getLogger(__name__)
def my_view(request, arg1, arg):
...
if bad_mojo:
# Log an error message
logger.error('Something went wrong!')
最佳实践
-
disable_existing_loggers== False
django本身是有一个logging配置的,这里有一个标志位去决定是否需要取消掉.
- 灵活运用
propagate和logging.getLogger(__name__)通过
.找父亲.'a.b' 是 ‘a.b.c’的父亲. ‘a.b’是logger name
以上所述就是小编给大家介绍的《python & django logging 小结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
区块链技术驱动金融
阿尔文德·纳拉亚南、约什·贝努、爱德华·费尔顿、安德鲁·米勒、史蒂文·戈德费德 / 林华、王勇 / 中信出版社,中信出版集团 / 2016-8-25 / CNY 79.00
从数字货币及智能合约技术层面,解读了区块链技术在金融领域的运用。“如果你正在寻找一本在技术层面解释比特币是如何运作的,并且你有一定计算机科学和编程的基本知识,这本书应该很适合你。” 《区块链:技术驱动金融》回答了一系列关于比特币如何运用区块链技术运作的问题,并且着重讲述了各种技术功能,以及未来会形成的网络。比特币是如何运作的?它因何而与众不同?你的比特币安全吗?比特币用户如何匿名?区块链如何......一起来看看 《区块链技术驱动金融》 这本书的介绍吧!