python日志公用文件设计-类似java的log4j

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/isscollege/article/details/80494009

一、 实现目标
本文完成python环境下,类似java的log4j实现,有下面需求
1、 日志输出到控制台,同时可以输出到文件
2、 日志文件可以在任何目录
如果不指定目录,则自动在当前目录下
3、 文件以当天日期为名称,同一天日志自动追加
4、 日志输出要定位到:天-时-分-秒,当前文件名-日志代码所在行号:(回车)日志内容
日志最大不同于print是日志能定位到代码所在输出行,print不可以
5、 python日志文件要能做为工具文件,放在python公用库目录,可以在任何项目中引用,类似java的公用jar包
二、 实现原理及示例代码


# -*- coding: utf-8 -*-
"""
2018-05-29 09:07:18
作者: 刘明

  %(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:    打印日志信息 

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身


"""
import logging
import datetime
def getLog(path='.'):  

   dt=datetime.datetime.now()
   dtstr=dt.strftime('%Y-%m-%d')
   #dtstr=dt.strftime('%Y-%m-%d_%H_%M_%S')
   #创建一个logger实例  
   logger = logging.getLogger("mylogger")  
   logging.basicConfig(filemode='wa')  
   hds=logger.handlers
   for h in hds:
         logger.removeHandler(h)  
   logger.setLevel(logging.INFO) 
 #创建一个handler,用于写入日志文件,handler可以把日志内容写到不同的地方  
   logName ="%s/%s.test.log"%(path,dtstr)
   fh = logging.FileHandler(logName)  
   fh.setLevel(logging.INFO)  
 #再创建一个handler,用于输出控制台  
   ch = logging.StreamHandler()  
   ch.setLevel(logging.INFO) 
   log_format=logging.Formatter("[%(asctime)s-%(filename)s:%(lineno)d]\n%(message)s",datefmt='%d %H:%M:%S')   
   fh.setFormatter(log_format) #setFormatter() selects a Formatter object for this handler to use  
   ch.setFormatter(log_format)   

   logger.addHandler(fh)   
   logger.addHandler(ch)  

   return logger



if __name__=='__main__':
      log=getLog()
      a=[45,66,88,345,88,1234]
      log.info(a)
      log.info('test1')
      log.info('test2')
      log.info('test3')


三、 公用工具包放置
这里采用spyder3,要找到package所在目录
在spyder3环境,console窗口,找到窗口右上解setting,一个齿轮–>show sys.path–>
C:\ProgramData\Anaconda3\lib\site-packages
上面就是package所在目录
将日志文件.py拷贝到上述目录即可

四、 使用方法如下



D:\python\workspace\base
下面代码
import mylog

log=mylog.getLog('d:/temp')
log.info([45,'学习','处理',235,24634,3456])
log.info([5,'学习2','处理3',35,634,756])



if __name__=='__main__':
      log=getLog()
      a=[45,66,88,345,88,1234]
      log.info(a)
      log.info('test1')
      log.info('test2')
      log.info('test3')
控制台输出如下
runfile('D:/python/workspace/excel2013/Test1.py', wdir='D:/python/workspace/excel2013')
[29 11:19:00-Test1.py:10]
[45, '学习', '处理', 235, 24634, 3456]
INFO:mylogger:[45, '学习', '处理', 235, 24634, 3456]
[29 11:19:00-Test1.py:11]
[5, '学习2', '处理3', 35, 634, 756]
INFO:mylogger:[5, '学习2', '处理3', 35, 634, 756]
[29 11:19:00-Test1.py:18]
[45, 66, 88, 345, 88, 1234]
INFO:mylogger:[45, 66, 88, 345, 88, 1234]
[29 11:19:00-Test1.py:19]
test1
INFO:mylogger:test1
[29 11:19:00-Test1.py:20]
test2
INFO:mylogger:test2
[29 11:19:00-Test1.py:21]
test3
INFO:mylogger:test3



created by 刘明
www.isscollege.com

阅读更多
换一批

没有更多推荐了,返回首页