=============================================== #最普通的log打印 import logging log_file="/tmp/mylog.log" logging.basicConfig(filename=log_file,level=logging.DEBUG) def fun1(): logging.debug("This is running fun1") if __name__=="__main__": fun1() ==============================================略复杂============ import logging log_file="/tmp/mylog2.log" log_level=logging.DEBUG handler = logging.FileHandler(log_file) #handler设置日志输出到的文件地址 formatter = logging.Formatter("[%(levelname)s][%(funcName)s][%(asctime)s]%(message)s") # formatter定义日志输出的格式 handler .setFormatter(formatter) #将格式加载到handler中 logger = logging.getLogger("test2")#定义logger logger.addHandler(handler)#将指定日志输出的handler加载到logger中 logger.setLevel(log_level)#定义logger的输出级别 def func1(): logger.debug("This is debug msg ") logger.info("This is info msg") logger.warn("This is warning msg") logger.error("This is error msg") logger.critical("This is critical msg") if __name__ == "__main__": func1() ======================================实现单例模式的logger============ import logging.handlers class FinalLogger: logger=None level={"n":logging.NOTSET, "d":logging.DEBUG, "i":logging.INFO, "w":logging.WARN, "e":logging.ERROR, "c":logging.CRITICAL} log_level = "d" log_file="final_logger.log" #日志路径,这样写是当前目录 log_max_byte=10*1024*1024 #每个备份文件最多10M log_bakcup_count=5 # 最多备份文件 @classmethod def getLogger(self): if FinalLogger.logger: return FinalLogger.logger FinalLogger.logger = logging.getLogger("logging_test3") log_handler = logging.handlers.RotatingFileHandler(filename=FinalLogger.log_file,maxBytes=FinalLogger.log_max_byte,backupCount=FinalLogger.log_bakcup_count) log_fmt = logging.Formatter("[%(levelname)s][%(funcName)s][%(asctime)s]%(message)s") log_handler.setFormatter(log_fmt) FinalLogger.logger.addHandler(log_handler) FinalLogger.logger.setLevel(FinalLogger.level.get(FinalLogger.log_level)) return FinalLogger.logger class TestFialLogger: logger = FinalLogger.getLogger() def func1(self): self.logger.debug("This is debug msg ") self.logger.info("This is info msg") self.logger.warn("This is warning msg") def func2(self): self.logger.error("This is error msg") self.logger.critical("This is critical msg") if __name__ == "__main__": testLogger = TestFialLogger() testLogger.func1() testLogger2 = TestFialLogger() testLogger2.func2() if testLogger.logger == testLogger2.logger: print "YES" else: print "NO" ================================================================ logging.basicConfig函数各参数: filename: 指定日志文件名 filemode: 和file函数意义相同,指定日志文件的打开模式,‘w‘或‘a‘ format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示: %(levelno)s: 打印日志级别的数值 %(levelname)s: 打印日志级别名称 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0] %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数 %(lineno)d: 打印日志的当前行号 %(asctime)s: 打印日志的时间 %(thread)d: 打印线程ID %(threadName)s: 打印线程名称 %(process)d: 打印进程ID %(message)s: 打印日志信息 datefmt: 指定时间格式,同time.strftime() level: 设置日志级别,默认为logging.WARNING stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略 ======================================================================================== import sys #将输出重定向到文件 origin = sys.stdout f = open(‘file.txt‘,‘w‘) sys.stdout = f print ‘start............‘ print ‘end..............‘ sys.stdout = origin f.close() #将日志同时输出到文件和屏幕 import logging logging.basicConfig(level=logging.DEBUG,format=‘%(asctime)s %(filename)s [line:%(lineno)s] %(levelname)s %(message)s‘,filename=‘logging_test4.log‘,filemode=‘w‘) #定义一个StreamHandler将INFO或更高级别的日志信息打印到标准错误,并将其添加到当前日志处理对象 console=logging.StreamHandler() console.setLevel(logging.INFO) formatter=logging.Formatter(‘%(name)-12s: %(levelname)-8s %(message)s‘) console.setFormatter(formatter) logging.getLogger(‘‘).addHandler(console) logging.debug("This is debug msg") logging.info("This is info msg") logging.warning("This is warning msg") 参考文章: http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html https://my.oschina.net/leejun2005/blog/126713
原文地址:http://592800277.blog.51cto.com/9783296/1855567