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 用户输出的消息