python 以单例模式封装logging相关api实现日志打印类
python 以单例模式封装logging相关api实现日志打印类
by:授客QQ:1033553122
测试环境:
Python版本:Python 2.7
实现功能:
支持自由配置,如下log.conf,
1)可以配置日志文件路径(log_file);
2)按日志数量配置(backup_count)及单个日志文件的大小(max_bytes_each),自动化循环切换日志文件;
3)支持日志格式自定义(fmt);
4)支持日志记录器名称自定义(logger_name)
6)支持控制台日志和文件日志
5) 支持控制台日志级别自定义(log_level_in_console)
6)支持文件日志级别自定义(log_level_in_logfile)
7) 支持控制台和文件日志的各自的开启和关闭(分别为console_log_on, logfile_log_on)
log.conf配置文件
./config/logconfig.conf配置如下:
[LOGGING]
log_file = d:/testlog.txt
max_bytes_each = 3
backup_count = 5
fmt = |(asctime)s |(filename)s[line: |(lineno)d] |(levelname)s: |(message)s
logger_name = test_logger
log_level_in_console = 20
log_level_in_logfile = 10
console_log_on = 1
logfile_log_on = 1
#日志级别:CRITICAL = 50 ERROR = 40 WARNING = 30 INFO = 20 DEBUG = 10 NOTSET = 0
#console_log_on = 1 开启控制台日志,logfile_log_on = 1 开启文件日志
实践代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'shouke'
import logging
from logging.handlers import RotatingFileHandler
import threading
import configparser
class LogSignleton(object):
def __init__(self, log_config):
pass
def __new__(cls, log_config):
mutex=threading.Lock()
mutex.acquire() # 上锁,防止多线程下出问题
if not hasattr(cls, 'instance'):
cls.instance = super(LogSignleton, cls).__new__(cls)
config = configparser.ConfigParser()
config.read(log_config)
cls.instance.log_filename = config.get('LOGGING', 'log_file')
cls.instance.max_bytes_each = int(config.get('LOGGING', 'max_bytes_each'))
cls.instance.backup_count = int(config.get('LOGGING', 'backup_count'))
cls.instance.fmt = config.get('LOGGING', 'fmt')
cls.instance.log_level_in_console = int(config.get('LOGGING', 'log_level_in_console'))
cls.instance.log_level_in_logfile = int(config.get('LOGGING', 'log_level_in_logfile'))
cls.instance.logger_name = config.get('LOGGING', 'logger_name')
cls.instance.console_log_on = int(config.get('LOGGING', 'console_log_on'))
cls.instance.logfile_log_on = int(config.get('LOGGING', 'logfile_log_on'))
cls.instance.logger = logging.getLogger(cls.instance.logger_name)
cls.instance.__config_logger()
mutex.release()
return cls.instance
def get_logger(self):
return self.logger
def __config_logger(self):
# 设置日志格式
fmt = self.fmt.replace('|','%')
formatter = logging.Formatter(fmt)
if self.console_log_on == 1: # 如果开启控制台日志
console = logging.StreamHandler()
#console.setLevel(self.log_level_in_console)
console.setFormatter(formatter)
self.logger.addHandler(console)
self.logger.setLevel(self.log_level_in_console)
if self.logfile_log_on == 1: # 如果开启文件日志
rt_file_handler = RotatingFileHandler(self.log_filename, maxBytes=self.max_bytes_each, backupCount=self.backup_count)
rt_file_handler.setFormatter(formatter)
self.logger.addHandler(rt_file_handler)
self.logger.setLevel(self.log_level_in_logfile)
if __name__ == '__main__':
logsignleton = LogSignleton('./config/logconfig.conf')
logger = logsignleton.get_logger()
#logger = logging.getLogger('test_logger') # 在其它模块中时,可这样获取该日志实例
logger.debug('this is a debug level message')
logger.info('this is info level message')
logger.warning('this is warning level message')
logger.error('this is error level message')
logger.critical('this is critical level message')
注:多次使用相同的name调用getLogger方法返回同一个logger对象,可通过id(obj)进行验证
运行结果:

d:\\目录下生成文件如下:

python 以单例模式封装logging相关api实现日志打印类的更多相关文章
- Python面向对象04 /封装、多态、鸭子类型、类的约束、super
Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...
- C# 中通过API实现的打印类
using System;using System.Collections;using System.Text;using System.Runtime.InteropServices; using ...
- python基础学习十 logging模块详细使用【转载】
很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...
- python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super
https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...
- python自定义封装logging模块
#coding:utf-8 import logging class TestLog(object): ''' 封装后的logging ''' def __init__(self , logger = ...
- python实现单例模式的三种方式及相关知识解释
python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...
- python 自动化之路 logging日志模块
logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...
- 【python接口自动化】- logging日志模块
前言:我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间.描述信息以及错误或者异常发生时候的特定上下文信息. logging模块介绍 Pyth ...
- Python模块学习:logging 日志记录
原文出处: DarkBull 许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...
随机推荐
- python使用(二)
Python中的集合类型. 1.list_option.py 2.listsplit_option.py 3. dic_option.py 4.iter_option.py 1.list_option ...
- (转)Python3之os模块
原文:https://www.cnblogs.com/wang-yc/p/5623981.html 一:简介 os模块主要用于提供系统高级别的操作. 二:常用方法 1 2 3 4 5 6 7 8 9 ...
- sql server always on安装
always on 是sql server 服务器的数据同步备份容灾工具, 集中了故障转移群集.数据库镜像和日志传送等功能. 环境: window server 2012 sql server 201 ...
- WebFlux基础之响应式编程
上篇文章,我们简单的了解了WebFlux的一些基础与背景,并通过示例来写了一个demo.我们知道WebFlux是响应式的web框架,其特点之一就是可以通过函数式编程方式配置route.另外究竟什么是响 ...
- 虚幻4引擎角色蓝图Character的Movement组件学习
Jumping/Falling Air Control :角色在空中时的控制参数.数值为1 代表完全控制. Air Control Boost Multiplier :当角色的速度超过 Velocit ...
- Java队列——线程池创建的例子
线程池为线程生命周期开销问题和资源不足问题提供了解决方案.通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上.其好处是,因为在请求到达时线程已经存在,所以无意中也消除了线程创建所带来的延迟.这 ...
- Deep learning with Python 学习笔记(1)
深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...
- zoj 2104 Let the Balloon Rise(map映照容器的应用)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2104 题目描述: Contest time again! Ho ...
- T4模板根据数据库表和列的Description生成代码的summary的终极解决方案
相信很多人都用T4模版生成代码,用T4模版生成标准代码真的很方便.我们经常根据表生成相关的代码, 但是估计很多人都遇见过同一个问题, 特别是我们在生成model的时候,代码中model中的Summar ...
- Redis-其他命令
1.排序 SORT : SORT sourcekey [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [A ...