forked from bajins/scripts_python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlog_util.py
More file actions
90 lines (76 loc) · 2.92 KB
/
log_util.py
File metadata and controls
90 lines (76 loc) · 2.92 KB
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# @Author : bajins https://www.bajins.com
# @File : log_util.py
# @Version: 1.0.0
# @Time : 2019/8/22 9:28
# @Project: windows-wallpaper-python
# @Package:
# @Software: PyCharm
import os
import sys
import time
import logging
class Singleton:
"""
单例装饰器。
"""
__cls = dict()
def __init__(self, cls):
self.__key = cls
def __call__(self, *args, **kwargs):
if self.__key not in self.cls:
self[self.__key] = self.__key(*args, **kwargs)
return self[self.__key]
def __setitem__(self, key, value):
self.cls[key] = value
def __getitem__(self, item):
return self.cls[item]
@property
def cls(self):
return self.__cls
@cls.setter
def cls(self, cls):
self.__cls = cls
# 如需打印不同路径的日志(运行日志、审计日志),则不能使用单例模式(注释或删除此行)。此外,还需设定参数name。
@Singleton
class Logger:
def __init__(self, set_level="INFO",
name=os.path.split(os.path.splitext(sys.argv[0])[0])[-1],
log_name=time.strftime("%Y-%m-%d.log", time.localtime()),
log_path=os.path.join(os.path.dirname(os.path.abspath(__file__)), "log"),
use_console=True):
"""
:param set_level: 日志级别["NOTSET"|"DEBUG"|"INFO"|"WARNING"|"ERROR"|"CRITICAL"],默认为INFO
:param name: 日志中打印的name,默认为运行程序的name
:param log_name: 日志文件的名字,默认为当前时间(年-月-日.log)
:param log_path: 日志文件夹的路径,默认为logger.py同级目录中的log文件夹
:param use_console: 是否在控制台打印,默认为True
"""
if not set_level:
# 设置set_level为None,自动获取当前运行模式
set_level = self._exec_type()
self.__logger = logging.getLogger(name)
# 设置日志级别
self.setLevel(getattr(logging, set_level.upper()) if hasattr(logging, set_level.upper()) else logging.INFO)
# 创建日志目录
if not os.path.exists(log_path):
os.makedirs(log_path)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler_list = list()
handler_list.append(logging.FileHandler(os.path.join(log_path, log_name), encoding="utf-8"))
if use_console:
handler_list.append(logging.StreamHandler())
for handler in handler_list:
handler.setFormatter(formatter)
self.addHandler(handler)
def __getattr__(self, item):
return getattr(self.logger, item)
@property
def logger(self):
return self.__logger
@logger.setter
def logger(self, func):
self.__logger = func
def _exec_type(self):
return "DEBUG" if os.environ.get("IPYTHONENABLE") else "INFO"