1 简单使用
import logging
logging.basicConfig(level=logging.ERROR, format='[%(levelname)s-%(asctime)s-PID:%(process)d-%(filename)s->%(funcName)s-line:%(lineno)d]: %(message)s')
def test():
try:
5/0
except Exception as e:
logging.error(e)
if __name__ == "__main__":
test()
"""
运行结果:
[root@Chasing-Dreams test]# python test.py
[ERROR-2023-04-11 17:10:06,385-PID:6062-test.py->test-line:10]: division by zero
"""
2 高级使用
import logging
import colorlog
class LoggerContext:
def __init__(self, name="logger", level=logging.DEBUG, log_file="log.log"):
self.name = name
self.level = level
self.logger = None
self.log_file = log_file
def __enter__(self):
self.logger = logging.getLogger(self.name)
self.logger.setLevel(self.level)
# 创建控制台输出处理器
console_handler = logging.StreamHandler()
console_handler.setLevel(self.level)
# 创建文件输出处理器
file_handler = logging.FileHandler(self.log_file)
file_handler.setLevel(self.level)
# 设置日志格式
log_format = '%(log_color)s[%(asctime)s-%(name)s-%(levelname)s-%(filename)s:%(lineno)d]:%(reset)s %(message)s'
formatter = colorlog.ColoredFormatter(log_format,
datefmt='%Y-%m-%d %H:%M:%S',
log_colors={
'DEBUG': 'white',
'INFO': 'green',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red,bg_white',
})
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加处理器到 logger 对象
self.logger.addHandler(console_handler)
self.logger.addHandler(file_handler)
return self.logger
def __exit__(self, exc_type, exc_value, traceback):
# 清除 logger 对象的处理器
for handler in self.logger.handlers[:]:
self.logger.removeHandler(handler)
def main():
logger.debug("这是一条DEBUG日志")
logger.info("这是一条INFO日志")
logger.warning("这是一条WARNING日志")
logger.error("这是一条ERROR日志")
logger.critical("这是一条CRITICAL日志")
if __name__ == "__main__":
with LoggerContext(level=logging.INFO) as logger:
main()
"""
运行结果:
(base) [root@Chasing-Dreams test]# python test.py
[2023-12-29 14:06:19-logger-DEBUG-test.py:47]: 这是一条DEBUG日志 # 白色
[2023-12-29 14:06:19-logger-INFO-test.py:48]: 这是一条INFO日志 # 绿色
[2023-12-29 14:06:19-logger-WARNING-test.py:49]: 这是一条WARNING日志 # 黄色
[2023-12-29 14:06:19-logger-ERROR-test.py:50]: 这是一条ERROR日志 # 红色
[2023-12-29 14:06:19-logger-CRITICAL-test.py:51]: 这是一条CRITICAL日志 # 白底红色
"""
import logging
def set_logger(log_level=logging.ERROR, log_file="/var/log/log.log"):
def add_log_color(fn):
def new(*args):
yellow = "\x1b[33m"
red = "\x1b[31m"
green = "\x1b[32m"
blue = "\x1b[36m"
normal = "\x1b[0m"
levelno = args[1].levelno
if levelno >= logging.CRITICAL:
color = red
elif levelno >= logging.ERROR:
color = red
elif levelno >= logging.WARNING:
color = yellow
elif levelno >= logging.INFO:
color = green
elif levelno >= logging.DEBUG:
color = blue
else:
color = normal
try:
args[1].msg = color + str(args[1].msg) + normal
except Exception as e:
print(e)
args[1].levelname = color + args[1].levelname + normal
args[1].pathname = args[1].pathname.replace("[此处写脚本所在目录,绝对路径]", "../")
return fn(*args)
return new
logging.StreamHandler.emit = add_log_color(logging.StreamHandler.emit)
logging.basicConfig(level=log_level,
filename=log_file,
format="%(asctime)s-%(levelname)-16s-[%(pathname)-20s:%(funcName)-15s:%(lineno)-4d] - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S")
def main():
set_logger(log_level=logging.DEBUG, log_file="log.log")
logging.debug("这是一条DEBUG日志")
logging.info("这是一条INFO日志")
logging.warning("这是一条WARNING日志")
logging.error("这是一条ERROR日志")
logging.critical("这是一条CRITICAL日志")
if __name__ == "__main__":
main()
"""
运行结果:
(base) [root@Chasing-Dreams test]# python test.py
(base) [root@Chasing-Dreams test]# tailf log.log
2024-02-01 16:17:47-DEBUG -[/tools/test/test2.py:main :43 ] - 这是一条DEBUG日志 # 蓝色
2024-02-01 16:17:47-INFO -[/tools/test/test2.py:main :44 ] - 这是一条INFO日志 # 绿色
2024-02-01 16:17:47-WARNING-[/tools/test/test2.py:main :45 ] - 这是一条WARNING日志 # 黄色
2024-02-01 16:17:47-ERROR -[/tools/test/test2.py:main :46 ] - 这是一条ERROR日志 # 红色
2024-02-01 16:17:47-CRITICAL-[/tools/test/test2.py:main :47 ] - 这是一条CRITICAL日志 # 红色
"""