python 以单例模式封装logging相关api实现日志打印类

 

by:授客QQ1033553122

测试环境:

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实现日志打印类的更多相关文章

  1. Python面向对象04 /封装、多态、鸭子类型、类的约束、super

    Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...

  2. C# 中通过API实现的打印类

    using System;using System.Collections;using System.Text;using System.Runtime.InteropServices; using ...

  3. python基础学习十 logging模块详细使用【转载】

    很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出,python的logging模块提供了标准的日志接口,你可以通过它存储各种格式的日志,主要用于输出 ...

  4. python 面向对象专题(四):封装、多态、鸭子类型、类的约束、super

    https://www.cnblogs.com/liubing8/p/11321099.html 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 ...

  5. python自定义封装logging模块

    #coding:utf-8 import logging class TestLog(object): ''' 封装后的logging ''' def __init__(self , logger = ...

  6. python实现单例模式的三种方式及相关知识解释

    python实现单例模式的三种方式及相关知识解释 模块模式 装饰器模式 父类重写new继承 单例模式作为最常用的设计模式,在面试中很可能遇到要求手写.从最近的学习python的经验而言,singlet ...

  7. python 自动化之路 logging日志模块

    logging 日志模块 http://python.usyiyi.cn/python_278/library/logging.html 中文官方http://blog.csdn.net/zyz511 ...

  8. 【python接口自动化】- logging日志模块

    前言:我们之前运行代码时都是将日志直接输出到控制台,而实际项目中常常需要把日志存储到文件,便于查阅,如运行时间.描述信息以及错误或者异常发生时候的特定上下文信息. logging模块介绍 ​ Pyth ...

  9. Python模块学习:logging 日志记录

    原文出处: DarkBull    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net ...

随机推荐

  1. 机器人之路的第一小步:录音+语音识别(语音转文字),大小600K(免费下载)!

    机器人之路的第一小步:录音+语音识别(语音转文字),大小600K,本人出品! 机器人之路的第一小步:录音+语音识别,准确率还不是特别高,不过普通话标准的话,识别准确率还是不错的,大家可以体验一下,请下 ...

  2. MVC3学习:实现文章上一篇下一篇链接

    文章的显示都是通过id查询数据库来显示.但是文章会经常删除,因此id号可能不是连续的,所以上一篇下一篇文章,不能简单的做id加减法. 我的思路是:先将表格中所有文章的ID号全部放入一个数组中,如果文章 ...

  3. Linux 变量的使用

    目录 1. Shell 脚本规范 2. Shell 脚本执行 3. Shell 脚本变量 3.1 环境变量 3.1.1 自定义环境变量 3.1.2 显示与取消环境变量 3.1.3 环境变量初始化与对应 ...

  4. MVC源码分析 - Error过滤器

    接 上一篇 内容, 这里先看一下错误处理过滤器. 在看此部分之前, 先看看MVC已经提供的功能吧. 一. MVC 自带功能 1. 配置方法 <system.web> <!--mode ...

  5. Visual Studio 2017 取消 break mode

    用 Visual Studio 2017 (以下简称 VS 2017) 运行程序,程序出错后,只是进入中断模式,仅显示 The application is in break mode而没有像 VS ...

  6. Python 工匠:编写条件分支代码的技巧

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由鹅厂优文发表于云+社区专栏 作者:朱雷 | 腾讯IEG高级工程师 『Python 工匠』是什么? 我一直觉得编程某种意义是一门『手艺』 ...

  7. ffplay源码分析3-代码框架

    ffplay是FFmpeg工程自带的简单播放器,使用FFmpeg提供的解码器和SDL库进行视频播放.本文基于FFmpeg工程4.1版本进行分析,其中ffplay源码清单如下: https://gith ...

  8. JavaWeb学习路线图

    基本把JavaWeb的学了有一半了,在网上找了个学习路线图,供参考.

  9. 使用Ajax的Time实现倒计时功能

    网上有网友想实现一个功能,就是倒计时的功能.以某时间点与当前时间比较,还剩余时间,进行实时显示.这个问题,让Insus.NET想起以前有做过一个实时时钟有点相似.http://zzk.cnblogs. ...

  10. js实现iview表格 排名列

    (有误,请勿观看) 一.排名的简单实现 //排名例子1 //需要排名的数组 //var myArray = [5,7, 7, 9, 8, 6, 23]; //新数组 //var thisArray = ...