需求:

一个Python服务器程序,可能会连续运行几个月,现在需要把每天产生的log信息写入到当天的文件中,即每天产生一个log文件。

使用logging模块编写程序,第一个版本如下:

import logging

import time

class LogSingleton(object):

@classmethod

def get_logger_v1(cls):

"""

获取一个最新设置的logger对象,使用当前时间(年-月-日)作为文件名

:return:

"""

logger = logging.getLogger()

logger.setLevel(level=logging.INFO)

handler = logging.FileHandler('%s_log.txt' % time.strftime("%Y-%m-%d"), mode='a')

handler.setLevel(logging.INFO)

formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

handler.setFormatter(formatter)

for h in logger.handlers:

logger.removeHandler(h) # 移除其他所有的handler

logger.addHandler(handler) # 设置新的handler

return logger

if __name__ == '__main__':

logger = LogSingleton.get_logger_v1()

logger.info('xxx')

需要说明的是,logging.getLogger()是一个单例函数,当getLogger不传参数或者传入同一个字符串时,获得的log对象是同一个对象,可以通过id()函数验证。

上述代码中每次调用get_logger_v1()就会更新log对象的handler,已达到更新log文件名的目的,当被设置了新的log文件名后,logging模块会帮我们创建这个文件(前提是其路径无误),后续的log信息就会写入到这个最新handler指定的log文件中。

关于性能的思考

如果程序中调用的地方比较多,那我们不得不考虑他的运行性能好不好。优化的基本思路是判断当前的handler中的文件名是否是当天的,如果是,直接返回;如果不是,再设置一个新的handler返回。

下面是优化后版本:

import logging

import time

from pathlib import Path

class LogSingleton(object):

@classmethod

def get_logger_v2(cls):

"""

获取一个最新设置的logger对象,使用当前时间(年-月-日)作为文件名

:return:

"""

logger = logging.getLogger()

logger.setLevel(level=logging.INFO)

if logger.hasHandlers():

if '%s_log.txt' % time.strftime("%Y-%m-%d") == Path(logger.handlers[0].baseFilename).name:

return logger

handler = logging.FileHandler('%s_log.txt' % time.strftime("%Y-%m-%d"), mode='a')

handler.setLevel(logging.INFO)

formatter = logging.Formatter('%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')

handler.setFormatter(formatter)

for h in logger.handlers:

logger.removeHandler(h) # 移除其他所有的handler,如果不移除之前的handler,可能会同时把log写入到不同的log文件中。

logger.addHandler(handler) # 设置新的handler

return logger

性能分析

if __name__ == '__main__':

i = 0

t = time.time()

while i < 10000:

logger = LogSingleton.get_logger_v2()

i += 1

print('v2: %.3fs' % (time.time() - t))

i = 0

t = time.time()

while i < 10000:

logger = LogSingleton.get_logger_v1()

i += 1

print('v1: %.3fs' % (time.time() - t))

耗时如下:

v2: 0.106s

v1: 1.394s

Process finished with exit code 0

一万次耗时,可以相差近14倍,这次优化效果还是很可观的。

End

python 记录日志到日志服务器_Python日志模块的使用与思考:服务器程序将每日日志写入每日日志文件,logging,及,把,每天,到,当天,中...相关推荐

  1. python 路径往上一层_Python常用模块之模块、包介绍和相关语法

    在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很 ...

  2. python logger 服务器_python——logger模块

    import logging #常用日志模块 #Logger:即 Logger Main Class,是我们进行日志记录时创建的对象,我们可以调用它的方法传入日志模板和信息,来生成一条条日志记录,称作 ...

  3. python requests post 二进制流_Python requests 模块

    requests Python 的内置 urllib 模块,可以用于访问资源,但是,用起来比较麻烦. requests 是一个第三方库,在处理 URL 资源上面非常方便,这也是入门爬虫比较推荐的库之一 ...

  4. python什么时候用框架_python时间模块的使用

    前言: 在开发中经常会与时间打交道,如:获取事件戳,时间戳的格式化等,这里简要记录一下python操作时间的方法. python中常见的处理时间的模块: time:处理时间的模块,如获取时间戳,格式化 ...

  5. python redis 人员信息查询_python redis 模块查询数据结果 bytes 类型转码的方法

    通过使用 python redis 模块的 client 进行数据获取时,如果没有专门设置,会获取到 b 开头的二进制类型,这是因为 redis 模块客户端交互时默认是 bytes 类型存储,其实初始 ...

  6. python绘制三维图散点图_python matplotlib模块——绘制三维图形、三维数据散点图...

    分类: 计算机视觉 python matplotlib模块,是扩展的MATLAB的一个绘图工具库.他可以绘制各种图形,可是最近最的一个小程序,得到一些三维的数据点图,就学习了下python中的matp ...

  7. python如何导入类里_Python导入模块中的所有类(98)

    要导入模块中的每个类,可使用下面的语法: from mod import * 不推荐使用这种导入方式,其原因有二.首先,如果只要看一下文件开头的import语句,就能清楚地知道程序使用了哪些类,将大有 ...

  8. python鼠标拖拽功能_Python wxpython模块响应鼠标拖动事件操作示例

    本文实例讲述了Python wxpython模块响应鼠标拖动事件操作.分享给大家供大家参考,具体如下: wxpython鼠标拖动事件小案例: #coding:UTF-8 import wx app = ...

  9. python卸载包很慢_Python卸载模块的方法汇总

    本文给大家汇总介绍了3种卸载Python已安装模块的方法,推荐大家使用easy_install或者pip的方式来进行,简单方便 easy_install 卸载 通过easy_install 安装的模块 ...

最新文章

  1. 为什么第二代测序碱基出错主要以替换(Substitutions)为主
  2. python学习笔记(六)——函数的作用域和装饰器
  3. linux ksh 历史命令,防止Linux中的bash(和ksh)历史记录更改
  4. 【笔记】spring的注解回顾,springboot-restful项目结构介绍 springboot-freemarker ⼯程配置详解
  5. DS5020配置集群存储
  6. 带有Prometheus的弹簧靴和Micrometer第5部分:旋转Prometheus
  7. leetcode132. 分割回文串 II(dp)
  8. 判断用户输入的这个数是不是质数
  9. layui.use 在a标签内onclick调用
  10. sass-loader高版本的坑
  11. MySQL老是提示视图没有主键
  12. javascript 的 split用法
  13. FileZilla Server 中文版使用教程
  14. 电梯控制系统设计(PLC及组态)
  15. 台北宇珍2021春拍捷报,美国博物馆专拍创下白手套佳绩
  16. Gitlab用户角色权限Guest、Reporter、Developer、Master、Owner
  17. Tableau中的LOOKUP函数
  18. 详解Canvas动画部分
  19. 用Cat.1+GPS+蓝牙+RFID实现工卡式室内室外定位器
  20. C语言学习开篇 对C语言和编程的认识

热门文章

  1. linux bash输入输出重定向
  2. linux无法设置日期 不允许的操作,如何解决系统时间无法修改的问题
  3. 计算机一级在线模拟试题,计算机一级模拟试题带答案
  4. Windows下在Django中创建项目时ImportError: No module named django.core解决方法
  5. FSWD_2_JavaScript
  6. 使用Google Page Speed
  7. 基因组关联分析中的交互作用研究
  8. Nanopore测序
  9. 战锤全面战争无法响应服务器,战锤:全面战争打不开 游戏无法启动解决办法...
  10. java 手机音频播放,用Java实现音频播放