Chinaunix首页 | 论坛 | 博客
  • 博客访问: 562429
  • 博文数量: 104
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1559
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-21 00:58
个人简介

锻炼精神,首先要锻炼肉体

文章分类

全部博文(104)

文章存档

2018年(1)

2016年(1)

2015年(101)

2014年(1)

我的朋友

分类: Python/Ruby

2015-05-12 16:25:15

本篇文章主要介绍一下,如何使用 python 来编写属于自己的日志模块

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

点击(此处)折叠或打开

  1. from     threading import Thread

  2. import     logging
  3. from     logging      import handlers
  4. from     logging.handlers import RotatingFileHandler
  5. from     logging      import Formatter

  6. from     time      import sleep
  7. import     time


  8. LOG_LEVEL = {
  9. 'default'     :logging.DEBUG,
  10. 'debug'        :logging.DEBUG,
  11. 'info'        :logging.INFO,
  12. 'warning'    :logging.WARNING,
  13. 'error'        :logging.ERROR,
  14. 'critical'    :logging.CRITICAL }

  15. LOG_FILENAME     = ''
  16. LOG_BACKUP_COUNTER = 3
  17. LOG_TYPE = 'default'
  18. LOG_MAX_SIZE = 1024*1024*4 # bits = 0.5MB of each log file


  19. def InitLogger(log_file_name, logger):
  20.     str_time      = time.strftime("%Y%m%d_%H%M%S")
  21.     LOG_FILENAME = str_time+'_'+log_file_name
  22.     #print(LOG_FILENAME)
  23.     
  24.     handler = RotatingFileHandler( LOG_FILENAME,maxBytes = LOG_MAX_SIZE, backupCount = LOG_BACKUP_COUNTER)
  25.    
  26.     # method indefault
  27.     # handler = FileHandler( LOG_FILENAME)
  28.   
  29.     # set log file output message format
  30.     fmt = '[ %(asctime)s ]--[ %(filename)s:%(lineno)s ]--[%(name)s]--[%(levelname)s]--[ %(message)s ]'
  31.  
  32.     formatter = Formatter (fmt)
  33.    
  34.     handler.setFormatter( formatter )
  35.   
  36.     logger.addHandler(handler)
  37.    
  38.     logger.setLevel(LOG_LEVEL.get(LOG_TYPE.lower()))

  39.     
  40.     # after set every parameters , return logger
  41.     return logger


  42. #define a thread writer class
  43. class log_writter(Thread):
  44.      def __init__(self,threadName,file_name):
  45.     
  46.      self.log_file_name = file_name

  47.      Thread.__init__(self,name = threadName)
  48.     
  49.      logger = logging.getLogger(self.log_file_name)
  50.     
  51.      self.logger = InitLogger(self.log_file_name,logger)
  52.     
  53.     
  54.     
  55.      def run(self):
  56.     
  57.          global i

  58.          self.logger.info(self.log_file_name)
  59.  
  60.          while i in range(10):
  61.             print '**** log writer '+self.log_file_name+' test ******'
  62.         
  63.             self.logger.info ('hello aimer')
  64.         
  65.             self.logger.debug ('hello kokia')
  66.     
  67.             self.logger.warning ('hello kylin-zhang')
  68.     
  69.             i += 1

  70.             time.sleep (3)
  71.         
  72.       print('end of log file test '+ self.log_file_name )
  73.           



  74. i = 0

  75. threadCounter = 2400

  76. for j in range(threadCounter):

  77.    # s is used for thread and log file no.
  78.    s = 'thread'
  79.    s +='_'+str(j)
  80.    
  81.    print ( s )
  82.    
  83.    log_file = str(j)+'_mylog.log'
  84.    my_logger = log_writter( s , log_file)
  85.    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

点击(此处)折叠或打开

  1. from     threading import Thread

  2. import     logging
  3. from     logging      import handlers
  4. from     logging.handlers import RotatingFileHandler
  5. from     logging      import Formatter

  6. from     time      import sleep
  7. import     time


  8. LOG_LEVEL = {
  9. 'default'     :logging.DEBUG,
  10. 'debug'        :logging.DEBUG,
  11. 'info'        :logging.INFO,
  12. 'warning'    :logging.WARNING,
  13. 'error'        :logging.ERROR,
  14. 'critical'    :logging.CRITICAL }

  15. LOG_FILENAME     = ''
  16. LOG_BACKUP_COUNTER = 3
  17. LOG_TYPE = 'default'
  18. LOG_MAX_SIZE = 1024*1024*32 # bits = 4MB


  19. def InitLogger(log_file_name, logger):
  20.     str_time      = time.strftime("%Y%m%d_%H%M%S")
  21.     LOG_FILENAME = str_time+'_'+log_file_name
  22.     print(LOG_FILENAME)
  23.     
  24.     handler = RotatingFileHandler( LOG_FILENAME,maxBytes = LOG_MAX_SIZE, backupCount = LOG_BACKUP_COUNTER)
  25.    
  26.     # method indefault
  27.     # handler = FileHandler( LOG_FILENAME)
  28.   
  29.     # set log file output message format
  30.     fmt = '[ %(asctime)s ]--[ %(filename)s:%(lineno)s ]--[%(name)s]--[%(levelname)s]--[ %(message)s ]'
  31.  
  32.     formatter = Formatter (fmt)
  33.    
  34.     handler.setFormatter( formatter )
  35.   
  36.     logger.addHandler(handler)
  37.    
  38.     logger.setLevel(LOG_LEVEL.get(LOG_TYPE.lower()))

  39.     
  40.     # after set every parameters , return logger
  41.     return logger

// node_id.py

点击(此处)折叠或打开

  1. from hashlib import sha1 # sha1() method
  2. from random import randint # randint method

  3. import logging

  4. # here we test our logger
  5. from myLogger import InitLogger

  6. # here we define a method with name of get_node_id
  7. # it will return a sha1 data with length = 20bytes = 8*20 = 160 bits
  8. # it's namespace length = 20bytes = 160 bits ,which means we could
  9. # get a unique node id from 2^160 ids

  10. def get_node_id():
  11.     hash = sha1()
  12.   # print hash just for test
  13.   # print ( hash)
  14.     s = ""
  15.     
  16.     # we try to get a string with length of 20 bytes
  17.     # and each byte in string is a random integer varied from 0 to 255
  18.     for i in range(20):
  19.         s += chr(randint(0,255))
  20.    
  21.     hash.update(s) # insert s string into hash dict

  22.   # print hash just for test
  23.   # print ( hash )
  24.   # print ( s )
  25.   # here is the test of myLogger.py
  26.    
  27.     log_file_name = 'node_id.log'
  28.     
  29.     mylogger = logging.getLogger(log_file_name)
  30.     mylogger = InitLogger(log_file_name , mylogger)
  31.   
  32.     mylogger.info('node id :'+hash.digest())


  33.   # return hash's binary value
  34.     return hash.digest ()

  35. # test method
  36. get_node_id()
end
阅读(1382) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~