[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]