配置文件:
1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3 """
4 logging配置
5 """
6
7 import os
8 import logging.config
9
10 # 定义三种日志输出格式 开始
11
12 standard_format = '[%(asctime) -s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
13 '[%(levelname)s][%(message)s]'
14
15 simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
16
17 id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
18
19 # 定义日志输出格式 结束
20
21 logfile_dir = os.path.dirname(os.path.abspath(__file__)) # log文件的目录
22
23 logfile_name = 'all2.log' # log文件名
24
25 # 如果不存在定义的日志目录就创建一个
26 if not os.path.isdir(logfile_dir):
27 os.mkdir(logfile_dir)
28
29 # log文件的全路径
30 logfile_path = os.path.join(logfile_dir, logfile_name)
31
32 # log配置字典
33 LOGGING_DIC = {
34 'version': 1,
35 'disable_existing_loggers': False,
36 'formatters': {
37 'standard': {
38 'format': standard_format,
39 'datefmt': '%Y-%m-%d %H:%M:%S',
40 },
41 'simple': {
42 'format': simple_format
43 },
44 },
45 'filters': {},
46 'handlers': {
47 'console': {
48 'level': 'DEBUG',
49 'class': 'logging.StreamHandler', # 打印到屏幕
50 'formatter': 'simple'
51 },
52 'default': {
53 'level': 'DEBUG',
54 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
55 'filename': logfile_path, # 日志文件
56 'maxBytes': 1024*1024*5, # 日志大小 5M
57 'backupCount': 5,
58 'formatter': 'standard',
59 'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
60 },
61 },
62 'loggers': {
63 '': {
64 'handlers': ['default', 'console'], # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
65 'level': 'DEBUG',
66 'propagate': True, # 向上(更高level的logger)传递
67 },
68 },
69 }
70 logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的配置
71 logger = logging.getLogger(__name__) # 生成一个log实例
72 logger.info('It works!') # 记录该文件的运行状态
调用测试文件:
1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3 """
4 MyLogging Test
5 """
6
7 import time
8 import logging
9 from log_demo import my_logging # 导入自定义的logging配置
10
11 logger = logging.getLogger(__file__) # 生成logger实例
12
13
14 def demo():
15 logger.debug("start range... time:{}".format(time.time()))
16 logger.info("中文测试开始。。。")
17 for i in range(10):
18 logger.debug("i:{}".format(i))
19 time.sleep(2)
20 else:
21 logger.debug("over range... time:{}".format(time.time()))
22 logger.info("中文测试结束。。。")
23
24 if __name__ == "__main__":
25 demo()
Django配置:
1 #! /usr/bin/env python
2 # -*- coding: utf-8 -*-
3 # __author__ = "Q1mi"
4 # Date: 2017/7/28
5
6
7
8 LOGGING = {
9 'version': 1,
10 'disable_existing_loggers': False,
11 'formatters': {
12 'standard': {
13 'format': '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]'
14 '[%(levelname)s][%(message)s]'
15 },
16 'simple': {
17 'format': '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
18 },
19 'collect': {
20 'format': '%(message)s'
21 }
22 },
23 'filters': {
24 'require_debug_true': {
25 '()': 'django.utils.log.RequireDebugTrue',
26 },
27 },
28 'handlers': {
29 #打印到终端的日志
30 'console': {
31 'level': 'DEBUG',
32 'filters': ['require_debug_true'],
33 'class': 'logging.StreamHandler',
34 'formatter': 'simple'
35 },
36 #打印到文件的日志,收集info及以上的日志
37 'default': {
38 'level': 'INFO',
39 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
40 'filename': os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件
41 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
42 'backupCount': 3,
43 'formatter': 'standard',
44 'encoding': 'utf-8',
45 },
46 #打印到文件的日志:收集错误及以上的日志
47 'error': {
48 'level': 'ERROR',
49 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
50 'filename': os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件
51 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
52 'backupCount': 5,
53 'formatter': 'standard',
54 'encoding': 'utf-8',
55 },
56 #打印到文件的日志
57 'collect': {
58 'level': 'INFO',
59 'class': 'logging.handlers.RotatingFileHandler', # 保存到文件,自动切
60 'filename': os.path.join(BASE_LOG_DIR, "xxx_collect.log"),
61 'maxBytes': 1024 * 1024 * 5, # 日志大小 5M
62 'backupCount': 5,
63 'formatter': 'collect',
64 'encoding': "utf-8"
65 }
66 },
67 'loggers': {
68 #logging.getLogger(__name__)拿到的logger配置
69 '': {
70 'handlers': ['default', 'console', 'error'],
71 'level': 'DEBUG',
72 'propagate': True,
73 },
74 #logging.getLogger('collect')拿到的logger配置
75 'collect': {
76 'handlers': ['console', 'collect'],
77 'level': 'INFO',
78 }
79 },
80 }
81
82
83 # -----------
84 # 用法:拿到俩个logger
85
86 logger = logging.getLogger(__name__) #线上正常的日志
87 collect_logger = logging.getLogger("collect") #领导说,需要为领导们单独定制领导们看的日志