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