lomg 发表于 2015-12-15 11:03:31

[python]使用 python 编写日志模块

本篇文章主要介绍一下,如何使用 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 ()
运行方法:
pythonmyLogger.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]
查看完整版本: [python]使用 python 编写日志模块