设为首页 收藏本站
查看: 1319|回复: 0

[经验分享] [python]使用 python 编写日志模块

[复制链接]

尚未签到

发表于 2015-12-15 11:03:31 | 显示全部楼层 |阅读模式
本篇文章主要介绍一下,如何使用 python 来编写属于自己的日志模块

1. 使用 python 来实现多线程并发写日志文件




  • from     threading import Thread


  • import     logging
  • from     logging        import handlers
  • from     logging.handlers import RotatingFileHandler
  • from     logging      import Formatter

  • from     time      import sleep
  • import     time


  • LOG_LEVEL = {
  • 'default'     :logging.DEBUG,
  • 'debug'        :logging.DEBUG,
  • 'info'        :logging.INFO,
  • 'warning'    :logging.WARNING,
  • 'error'        :logging.ERROR,
  • 'critical'    :logging.CRITICAL }

  • LOG_FILENAME     = ''
  • LOG_BACKUP_COUNTER = 3
  • LOG_TYPE = 'default'
  • LOG_MAX_SIZE = 1024*1024*4 # bits = 0.5MB of each log file


  • def InitLogger(log_file_name, logger):
  •     str_time      = time.strftime("%Y%m%d_%H%M%S")
  •     LOG_FILENAME = str_time+'_'+log_file_name
  •     #print(LOG_FILENAME)

  •     handler = RotatingFileHandler( LOG_FILENAME,maxBytes = LOG_MAX_SIZE, backupCount = LOG_BACKUP_COUNTER)

  •     # method indefault
  •     # handler = FileHandler( LOG_FILENAME)

  •     # set log file output message format
  •     fmt = '[ %(asctime)s ]--[ %(filename)s:%(lineno)s ]--[%(name)s]--[%(levelname)s]--[ %(message)s ]'

  •     formatter = Formatter (fmt)

  •     handler.setFormatter( formatter )

  •     logger.addHandler(handler)

  •     logger.setLevel(LOG_LEVEL.get(LOG_TYPE.lower()))


  •     # after set every parameters , return logger
  •     return logger


  • #define a thread writer class
  • class log_writter(Thread):
  •      def __init__(self,threadName,file_name):

  •       self.log_file_name = file_name

  •       Thread.__init__(self,name = threadName)

  •       logger = logging.getLogger(self.log_file_name)

  •       self.logger = InitLogger(self.log_file_name,logger)



  •      def run(self):

  •          global i

  •           self.logger.info(self.log_file_name)

  •          while i in range(10):
  •             print '**** log writer '+self.log_file_name+' test ******'

  •             self.logger.info ('hello aimer')

  •             self.logger.debug ('hello kokia')

  •             self.logger.warning ('hello kylin-zhang')

  •             i += 1

  •             time.sleep (3)

  •       print('end of log file test '+ self.log_file_name )




  • i = 0

  • threadCounter = 2400

  • for j in range(threadCounter):

  •    # s is used for thread and log file no.
  •    s = 'thread'
  •    s +='_'+str(j)

  •    print ( s )

  •    log_file = str(j)+'_mylog.log'
  •    my_logger = log_writter( s , log_file)
  •    my_logger.start ()
运行方法:
python  myLogger.py
2. 将编写的日志模块简单修改之后应用在实际项目代码中

在这个地方会涉及到这样一个问题:
如何将一个路径下面的 .py 文件中定义的方法引入到另一个 .py 文件中
解决方法很简单:
举例来说,我们要在 node.py 中使用 myLogger.py 中定义并且实现的 InitLogger 这个方法
|------ myLogger.py
|------ node_id.py

首先在需要引入的 .py 文件(myLogger.py)路径下面创建一个名为 __init__.py 的文件即可(空文件就可以,
python 会将含有该文件的文件夹当做是一个模块--->module)
|--- myLogger.py
|--- __init__.py (刚刚创建)
|--- node_id.py

然后在 node_in.py 文件中的开头部分添加引入 myLogger.py 以及引入文件中某个方法的声明语句 :
from myLogger import InitLogger
即可

如果要将日志模块添加到代码中,需要对刚刚编写的 myLogger.py 文件中多线程类和后面调用多线程来写日志的代码进行注释
使用 '''''''  便可以实现注释的功能

// another version of myLogger.py
// myLogger.py



  • from     threading import Thread


  • import     logging
  • from     logging        import handlers
  • from     logging.handlers import RotatingFileHandler
  • from     logging      import Formatter

  • from     time      import sleep
  • import     time


  • LOG_LEVEL = {
  • 'default'     :logging.DEBUG,
  • 'debug'        :logging.DEBUG,
  • 'info'        :logging.INFO,
  • 'warning'    :logging.WARNING,
  • 'error'        :logging.ERROR,
  • 'critical'    :logging.CRITICAL }

  • LOG_FILENAME     = ''
  • LOG_BACKUP_COUNTER = 3
  • LOG_TYPE = 'default'
  • LOG_MAX_SIZE = 1024*1024*32 # bits = 4MB


  • def InitLogger(log_file_name, logger):
  •     str_time      = time.strftime("%Y%m%d_%H%M%S")
  •     LOG_FILENAME = str_time+'_'+log_file_name
  •     print(LOG_FILENAME)

  •     handler = RotatingFileHandler( LOG_FILENAME,maxBytes = LOG_MAX_SIZE, backupCount = LOG_BACKUP_COUNTER)

  •     # method indefault
  •     # handler = FileHandler( LOG_FILENAME)

  •     # set log file output message format
  •     fmt = '[ %(asctime)s ]--[ %(filename)s:%(lineno)s ]--[%(name)s]--[%(levelname)s]--[ %(message)s ]'

  •     formatter = Formatter (fmt)

  •     handler.setFormatter( formatter )

  •     logger.addHandler(handler)

  •     logger.setLevel(LOG_LEVEL.get(LOG_TYPE.lower()))


  •     # after set every parameters , return logger
  •     return logger

// node_id.py



  • from hashlib import sha1   # sha1() method

  • from random import randint # randint method

  • import logging

  • # here we test our logger
  • from myLogger import InitLogger

  • # here we define a method with name of get_node_id
  • # it will return a sha1 data with length = 20bytes = 8*20 = 160 bits
  • # it's namespace length = 20bytes = 160 bits  ,which means we could

  • # get a unique node id from 2^160 ids

  • def get_node_id():
  •     hash = sha1()
  •   # print hash just for test
  •   # print ( hash)
  •     s    = ""

  •     # we try to get a string with length of 20 bytes
  •     # and each byte in string is a random integer varied from 0 to 255
  •     for i in range(20):
  •         s += chr(randint(0,255))

  •     hash.update(s)     # insert s string into hash dict

  •   # print hash just for test
  •   # print ( hash )
  •   # print ( s )
  •   # here is the test of myLogger.py

  •     log_file_name = 'node_id.log'


  •     mylogger = logging.getLogger(log_file_name)
  •     mylogger = InitLogger(log_file_name , mylogger)

  •     mylogger.info('node id :'+hash.digest())



  •   # return hash's binary value
  •     return hash.digest ()

  • # test method
  • get_node_id()
end

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151448-1-1.html 上篇帖子: 第一章 python入门 下篇帖子: 用Python绘制音乐图谱
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表