人生苦短,我用python。

一、logging模块

1、基本使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 1、基本使用
# 1.1 定义日志基本信息
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s- %(filename)s(%(lineno)d)- %(levelname)s- %(message)s')
# 函数各参数:
# level:设置日志级别,默认为logging.WARNNIN
# filename:指定使用指定的文件名而不是StreamHandler创建FileHandler
# filemode:指定日志文件的打开模式,'w'或者'a',默认'a'
# datefmt:指定时间格式,同time.strftime()
# stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr
# format:指定输出的格式和内容:
# %(asctime)s:打印日志的时间
# %(filename)s:打印当前执行程序名
# %(lineno)d:打印日志的当前行号
# %(levelname)s:打印日志级别的名称
# %(levelno)s:打印日志级别的数值
# %(message)s:打印日志信息
# %(module)d:所在的模块名(如test.py模块则记录test)
# %(funcName)s:打印日志的当前函数
# %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
# %(thread)d:打印线程ID
# %(threadName)s:打印线程名称
# %(process)d:打印进程ID
# %(name)s:调用的logger记录器的名称

# 1.2 实例化日志对象
logger = logging.getLogger(name=__name__) # 指定name,返回一个名称为name的Logger实例。如果再次使用相同的名字,是实例化一个对象。未指定name,返回Logger实例,名称是root,即根Logger。

# 1.3 根据不同日志级别打印日志
logger.debug('DEBUG log') # 调试,级别10
logger.info('INFO log') # 信息,级别20
logger.warning('WARNING log') # 警告,级别30,默认
logger.error('ERROR log') # 错误,级别40
logger.critical('CRITICAL log') # 严重,级别50

2、将日志写入到文件和输出到屏幕

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 2、将日志写入到文件和输出到屏幕
# 2.1 创建logger
logger = logging.getLogger() # 定义logger实例
logger.setLevel(logging.DEBUG) # 定义打印信息级别

# 2.2 创建FileHandler,写入日志文件
file_handler = logging.FileHandler(r'E:\test.log', 'a', encoding='utf-8') # 定义FileHandler,用于写到本地
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(logging.Formatter('%(asctime)s - %(filename)s(%(lineno)d) - %(levelname)s - %(message)s'))

# 2.3 创建StreamHandler,屏幕打印日志
console_handler = logging.StreamHandler() # 定义StreamHandler,用于输出到屏幕
console_handler.setLevel(logging.INFO)
console_handler.setFormatter(logging.Formatter('%(asctime)s - %(filename)s(%(lineno)d) - %(levelname)s - %(message)s'))

# 2.4 创建RotatingFileHandler,用于日志回滚
rollback_handler = RotatingFileHandler(r'E:\rollback.log', maxBytes = 1*1024, backupCount=3) # 定义RotatingFileHandler,每个日志文件累计最大1K,最多备份3个日志文件
rollback_handler.setLevel(logging.INFO)
rollback_handler.setFormatter(logging.Formatter('%(asctime)s - %(filename)s(%(lineno)d) - %(levelname)s - %(message)s'))

# 2.5 logger中添加Handler
logger.addHandler(file_handler) # logger实例中添加FileHandler
logger.addHandler(console_handler) # logger实例中添加StreamHandler
logger.addHandler(rollback_handler) # logger实例中添加rollback_handler

# 2.6 捕获traceback,用于记录异常返回信息
try:
open(r'E:\NoSuchFile.txt','r')
except (SystemExit, KeyboardInterrupt):
raise
except Exception:
logger.error("Faild to open NoSuchFile.txt from logger.error", exc_info = True)

logger.debug('DEBUG log')
logger.info('INFO log')
logger.warning('WARNING log')
logger.error('ERROR log')
logger.critical('CRITICAL log')

3、利用互斥锁保证将项目日志保存到同一个日志文件中共享数据操作的完整性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 3、利用互斥锁保证将项目日志保存到同一个日志文件中共享数据操作的完整性
class Log:
pass

class MyLog:
"""单独启用线程写入日志信息"""

log = None
mutex = threading.Lock() # 互斥锁

@staticmethod
def mylog():
"""
利用互斥锁来保证共享数据操作的完整性
:return: 日志logger
"""
if MyLog.log is None:
MyLog.mutex.acquire() # 锁占用
MyLog.log = Log()
MyLog.mutex.release() # 锁释放
return MyLog.log.logger

持续更新…

最后更新: 2018年12月05日 10:36

原始链接: http://pythonfood.github.io/2017/12/30/python日志/

× 多少都行~
打赏二维码