1、事件追踪
在什么样的时间发生了什么样的事情
2、bug调试
3、程序告警
4、大数据统计
ELK 日志分析系统
elasticsearh + logstasn + kibana
名词概念
loggers:日志器 —— 定大方向:1
handlers:处理器 —— 执行:3
formatters:格式化,是与处理器进行绑定的 —— 规矩:2
filters:过滤器,控制输出的内容
# 日志等级
"""
debug
info
warning
error
critical
"""
import logging
muyi = '%(asctime)s - %(levelname)s - %(name)s - %(lineno)d'
logging.basicConfig(
level=logging.WARNING, # 自定义日志等级等级
format=muyi, # 绑定
filename='my.log', # 保存的文件
filemode='a', # 写入方式
)
a = 'hello world'
logging.debug(a)
logging.info(a)
logging.warning(a)
logging.error(a)
logging.critical(a)
简单的日志配置
settings .py
# 简单的日志配置
LOGGING = {
'version': 1,
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, "logs/django.log")
}
},
'loggers': {
'django': {
'handlers': ['file'],
'level': 'INFO',
'propagate': True
}
}
}
使用日志中的配置
views.py
log = logging.getLogger('django.log') # django.log 要和配置中的一致
def hello(request):
log.info('hello world')
print('你好世界')
return HttpResponse('你好')
urls.py
from django.urls import path
from .views import hello
app_name = 'the_17' # 命名空间
urlpatterns = [
path('hello/', hello),
]
保存的日志文件
常用的 handlers
# 简单的日志配置
LOGGING = {
'version': 1,
'handlers': {
'file': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, "logs/django.log") # 输出到文件夹
},
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'simple' # 选择输出模板,输出到控制台
}
},
'loggers': {
'django': {
'handlers': ['file','console'],
'level': 'INFO',
'propagate': True
}
},
常用的 formatters
# 模板
'formatters': {
'verbose': {
'format': '(levelname) {asctime} {module} {lineno:d} {message}',
'style': '{',
},
'simple': {
"format": "(levelname) {module} {lineno:d} {message}",
'style': '{'
},
'verbose_more': {
"format": "(levelname) {asctime} [{filename}:{lineno}] {process:d} {thread:d} {threadName}",
'style': '{'
}
常用的 filters
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse' # DEBUG = False 时才会输出日志
}
},
自定义 filters
'skip_unreadable_fuck': {
'()': 'django.utils.log.CallbackFilter',
'callback': skip_fuck, # 不能带 Fuck 输出
}
settings.py / logging 代码
LOGGING = {
'version': 1,
'handlers': {
'files': {
'level': 'INFO',
'class': 'logging.FileHandler',
'filename': os.path.join(BASE_DIR, "logs/django.log"), # 输出到文件夹
'filters': ['require_debug_true', 'skip_unreadable_fuck'],
'maxBytes': 300 * 1024 * 1024, # django.log 保存最大为300M
'backupCount': 10, # 超出300M 重新创建 django.log, 最大创建10个,多出的覆盖前面的
},
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'simple', # 选择输出模板,输出到控制台
}
},
'loggers': {
'django': {
'handlers': ['files', 'console'],
'level': 'INFO',
'propagate': True
}
},
# 模板
'formatters': {
'verbose': {
'format': '(levelname) {asctime} {module} {lineno:d} {message}',
'style': '{',
},
'simple': {
"format": "(levelname) {module} {lineno:d} {message}",
'style': '{'
},
'verbose_more': {
"format": "(levelname) {asctime} [{filename}:{lineno}] {process:d} {thread:d} {threadName}",
'style': '{'
}
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugTrue' # DEBUG = True 时才会输出日志
}
},
'skip_unreadable_fuck': {
'()': 'django.utils.log.CallbackFilter',
'callback': skip_fuck, # 不能带 Fuck 输出
}
}