25 python日志模板logging

  1 --------1,日志的级别-------------------
  2 Level    Numeric value
  3 CRITICAL    50
  4 ERROR    40
  5 WARNING    30
  6 INFO    20
  7 DEBUG    10
  8 NOTSET    0
  9 
 10 值越小,打印出的日志越多
 11 级别高低顺序:NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
 12 如果把looger的级别设置为INFO, 那么小于INFO级别的日志都不输出, 大于等于INFO级别的日志都输出
 13 -----------------------------
 14 1.基本元素说明:
 15 
 16 Logger:用于输出的日志的总对象
 17 Handlers:用来指定log的输出方式
 18 Formatters:设置日志信息的结构和内容格式,默认的时间格式为%Y-%m-%d %H:%M:%S
 19 Filter:过滤器,用来过滤的输出内容(如:只输出debug以上的内容)
 20 
 21 ------------------------------
 22 2,Logger 常用函数
 23 
 24 LOG=logging.getLogger(”chat.gui”)   logging.getLogger([name])
 25 Logger.setLevel(lel)            ##:指定最低的日志级别,低于lel的级别将被忽略。debug是最低的内置级别,critical为最高
 26 Logger.addFilter(filt)、Logger.removeFilter(filt)        ##:添加或删除指定的filter
 27 Logger.addHandler(hdlr)、Logger.removeHandler(hdlr)      ##:增加或删除指定的handler
 28 Logger.debug()、Logger.info()、Logger.warning()、Logger.error()、Logger.critical()       ##:可以设置的日志级别
 29 Logger.log(“debug”,”This is a bug”)                      ##:可以通过这个函数直接输出内容并选择对应的告警级别
 30 
 31 
 32 
 33 3.Handlers 常用函数
 34 
 35 Handler.setLevel(lel):指定被处理的信息级别,低于lel级别的信息将被忽略
 36 Handler.setFormatter():给这个handler选择一个格式
 37 Handler.addFilter(filt)、Handler.removeFilter(filt):新增或删除一个filter对象
 38 
 39 ---########################## 代码举例1 普通简单的##############################################
 40 import logging
 41 ##logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)   此名也是可以的
 42 logging.basicConfig(filename="config.log",filemode="w",format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",level=logging.INFO)
 43 logging.debug('This message should appear on the console')
 44 logging.info('This message should appear on the console')
 45 
 46 
 47 filemode="w" --表示发覆盖的方式写
 48 'a'  --- 表示追加
 49 
 50 
 51 ------############### 代码举例 ########################################################
 52 
 53 import logging
 54 
 55 # 创建一个logger
 56 logger = logging.getLogger('mylogger')
 57     ## 返回一个logger实例,如果没有指定name,返回root logger。
 58     ##只要name相同,返回的logger实例都是同一个而且只有一个,即name和logger实例是一一对应的。
 59     ##这意味着,无需把logger实例在各个模块中传递。只要知道name,就能得到同一个logger实例。
 60 logger.setLevel(logging.DEBUG)
 61 
 62 # 创建一个handler,用于写入日志文件
 63 fh = logging.FileHandler('test.log')
 64 fh.setLevel(logging.DEBUG)
 65 
 66 # 再创建一个handler,用于输出到控制台(通过handler对象可以把日志内容写到不同的地方)
 67 #1 StreamHandler: 输出到控制台
 68 #2 FileHandler:   输出到文件
 69 #3 BaseRotatingHandler 可以按时间写入到不同的日志中。比如将日志按天写入不同的日期结尾的文件文件。
 70 #4 SocketHandler 用TCP网络连接写LOG
 71 #5 DatagramHandler 用UDP网络连接写LOG
 72 #6 SMTPHandler 把LOG写成EMAIL邮寄出去
 73 ch = logging.StreamHandler()
 74 ch.setLevel(logging.INFO)
 75 
 76 # 定义handler的输出格式 (参数,请参照后面的说明)
 77 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
 78 fh.setFormatter(formatter)
 79 ch.setFormatter(formatter)
 80 
 81 # 给logger添加handler
 82 logger.addHandler(fh)
 83 logger.addHandler(ch)
 84 
 85 # 记录一条日志
 86 logger.info('foorbar')
 87 logger.debug('foorbar')
 88 
 89 ---输出说明:
 90     屏幕显示--由于定义的是INFO级别的日志,则只能打印出,级别高于等于INFO的信息
 91     文件打印--则可以打印出DEBUG及以上级别的日志
 92 
 93 
 94 
 95 -------------举例 2 -----------------------------
 96 #!/usr/local/bin/python
 97 # coding=utf-8 + BOM
 98 
 99 __author__ = 'Huang Yuan Yuan'
100 
101 import logging
102 
103 #用字典保存日志级别
104 format_dict = {
105 1:logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
106 2:logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
107 3:logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
108 4:logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'),
109 5:logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
110 }
111 print('xxx')
112 
113 class Logger(object):
114     def __init__(self, logname, loglevel, logger):
115         '''
116            指定保存日志的文件路径,日志级别,以及调用文件
117            将日志存入到指定的文件中
118         '''
119 
120     # 创建一个logger
121         self.logger=logging.getLogger(logger)
122         self.logger.setLevel(logging.DEBUG)
123 
124         # 创建一个handler,用于写入日志文件
125         fh = logging.FileHandler(logname)
126         fh.setLevel(logging.DEBUG)
127 
128         # 再创建一个handler,用于输出到控制台
129         ch = logging.StreamHandler()
130         ch.setLevel(logging.DEBUG)
131 
132         # 定义handler的输出格式
133         #formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
134         formatter = format_dict[int(loglevel)]
135         fh.setFormatter(formatter)
136         ch.setFormatter(formatter)
137 
138         # 给logger添加handler
139         self.logger.addHandler(fh)
140         self.logger.addHandler(ch)
141 
142     def getlog(self):
143         return self.logger
144 
145 p_log= Logger(logname='log.txt', loglevel=1, logger="1.py")
146 p_log.logger.info('aaaaaa')
147 
148 ---或者使用此方式
149 logger= Logger(logname='log.txt', loglevel=1, logger="1.py").getlog()
150 logger.info('cccc')
151 
152 
153 ----------------------------------------------------------
154 
155 
156 
157 
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 
168 
169 
170 
171 
172 
173 ------######################### 说明  ##############################################
174 2.Handler种类
175 
176 logging.StreamHandler
177 使用这个Handler可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息。
178 它的构造函数是:StreamHandler([strm])
179 其中strm参数是一个文件对象。
180 默认是sys.stderr
181 logging.FileHandler
182 和StreamHandler类似,用于向一个文件输出日志信息。不过FileHandler会帮你打开这个文件。
183 它的构造函数是:FileHandler(filename[,mode])
184 filename是文件名,必须指定一个文件名。
185 mode是文件的打开方式。
186 默认是’a’,即添加到文件末尾。
187 logging.handlers.RotatingFileHandler
188 这个Handler类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出。比如日志文件是chat.log。当chat.log达到指定的大小之后,RotatingFileHandler自动把 文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。。。最后重新创建 chat.log,继续输出日志信息。
189 它的构造函数是:RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])
190 其中filename和mode两个参数和FileHandler一样。
191 maxBytes用于指定日志文件的最大文件大小。如果maxBytes为0,意味着日志文件可以无限大,这时上面描述的重命名过程就不会发生。
192 backupCount用于指定保留的备份文件的个数。比如,如果指定为2,当上面描述的重命名过程发生时,原有的chat.log.2并不会被更名,而是被删除。
193 logging.handlers.TimedRotatingFileHandler
194 这个Handler和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就 自动创建新的日志文件。重命名的过程与RotatingFileHandler类似,不过新的文件不是附加数字,而是当前时间。它的构造函数是:
195 TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])
196 其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义。
197 interval是时间间隔。
198 when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:
199 S 秒
200 M 分
201 H 小时
202 D 天
203 W 每星期(interval==0时代表星期一)
204 midnight 每天凌晨
205 logging.handlers.SocketHandler
206 logging.handlers.DatagramHandler
207 以上两个Handler类似,都是将日志信息发送到网络。不同的是前者使用TCP协议,后者使用UDP协议。它们的构造函数是:
208 Handler(host, port)
209 其中host是主机名,port是端口名
210 logging.handlers.SysLogHandler
211 logging.handlers.NTEventLogHandler
212 logging.handlers.SMTPHandler
213 logging.handlers.MemoryHandler
214 logging.handlers.HTTPHandler
215 Formatters
216 
217 参数    含义
218 %(name)s    Logger的名字
219 %(levelno)s    数字形式的日志级别
220 %(levelname)s    文本形式的日志级别
221 %(pathname)s    调用日志输出函数的模块的完整路径名,可能没有
222 %(filename)s    调用日志输出函数的模块的文件名
223 %(module)s    调用日志输出函数的模块名
224 %(funcName)s    调用日志输出函数的函数名
225 %(lineno)d    调用日志输出函数的语句所在的代码行
226 %(created)f    当前时间,用UNIX标准的表示时间的浮点数表示
227 %(relativeCreated)d    输出日志信息时的,自Logger创建以 来的毫秒数
228 %(asctime)s    字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
229 %(thread)d    线程ID。可能没有
230 %(threadName)s    线程名。可能没有
231 %(process)d    进程ID。可能没有
232 %(message)s    用户输出的消息
233 
234 --------------------------------------------------------------
235 1.python中配置logging有两种 方式:
236 
237   第 一种:基础配置
238 
239   logging.basicConfig(filename="config.log",filemode="w",format="%(asctime)s-%(name)s-%(levelname)s-%(message)s",level=logging.INFO)
240 
241   basicConfig 用来在代码中配置日志
242   filename指定 日志被保存到某个具体的文件
243   filename设置 文件有写的权限
244   format设置记录的属性, 比如时间、等级、信息等
245   level指定记录 日志的等级(level以上)
246   第 二种:使 用配置文件的方式配置logging,使 用下面的函数来读取配置文件
247 
248   fileConfig(filename,defaults=None,disable_existing_loggers=Ture )
249 
250   2.在logging.basicConfig()函数中可通过具体参数来更更改logging模块默认行为,可用参数有:
251 
252   filename: 用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样 日志会被存储在指定的文件中
253   filemode: 文件打开方式,在指定了filename时使 用这个参数,默认值为“a”还可指定为“w”
254   format: 指定handler使 用的 日志显示格式
255   datefmt: 指定 日期时间格式
256   level: 设置rootlogger(后边会讲解具体概念)的日志级别
257   stream: 用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr若同时列列出了filename和stream两个参数,则stream参数会被忽略。
258   3.format参数中可能用到的格式化:
259 
260   (name)s Logger的名字 %(levelno)s 数字形式的日志级别 %(levelname)s 文本形式的日志级别
261   (pathname)s 调用日志输出函数的模块的完整路路径名,可能没有
262   (filename)s 调用日志输出函数的模块的 文件名
263   (module)s 调用日志输出函数的模块名
264   (funcName)s 调用日志输出函数的函数名
265   (lineno)d 调用日志输出函数的语句句所在的代码行行
266   (created)f 当前时间,用UNIX标准的表示时间的浮点数表示
267   (relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数 %(asctime)s 字符串串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒 (thread)d 线程ID。可能没有 %(threadName)s 线程名。可能没有 %(process)d 进程ID。可能没有 %(message)s 用户输出的消息

 

posted @ 2018-07-02 15:59  虫儿要吃草  阅读(413)  评论(0编辑  收藏  举报