• python logging 模块完整使用示例


    支持文件、屏幕打印、电子邮件、TCP、UDP、syslog本地、syslog远程、windows事件、http server方式记录日志:

      1 #!/usr/bin/python
      2 import os
      3 import sys
      4 import logging
      5 import logging.config
      6 from logging import handlers
      7 
      8 DEBUG = True
      9 
     10 SYSLOG_HANDLER_HOST = 'localhost'
     11 
     12 LOG_PATH = '../server.log'
     13 
     14 MAIL_HANDLER_HOST = 'smtp.qq.com'
     15 MAIL_HANDLER_FROMADDR = 'user@qq.com'
     16 MAIL_HANDLER_TOADDRS = ['user1@qq.com','user2@gmail.com']
     17 MAIL_HANDLER_SUBJECT = 'Logging from python app'
     18 MAIL_HANDLER_CREDENTIALS = ('user@qq.com','password')
     19 
     20 TCPSOCKET_HANDLER_HOST = 'localhost'
     21 TCPSOCKET_HANDLER_PORT = 9022
     22 
     23 UDPSOCKET_HANDLER_HOST = 'localhost'
     24 UDPSOCKET_HANDLER_PORT = 9021
     25 
     26 NTEVENT_HANDLER_APPNAME = 'Python Application'
     27 NTEVENT_HANDLER_LOGTYPE = 'Application'
     28 
     29 HTTP_HANDLER_HOST = 'localhost:8000'
     30 HTTP_HANDLER_URL = '/logging'
     31 HTTP_HANDLER_METHOD = 'GET'
     32 
     33 
     34 LOGGING = {
     35     'version': 1,
     36     'disable_existing_loggers': True,
     37     'formatters': {
     38        'detail': {
     39             'format': '%(name)s %(levelname)s %(asctime)s %(module)s %(process)d %(thread)d [%(pathname)s:%(lineno)d] %(message)s'
     40         },
     41         'verbose': {
     42             'format': '%(name)s %(levelname)s %(asctime)s [%(pathname)s:%(lineno)d] %(message)s'
     43         },
     44         'simple': {
     45             'format': '%(name)s %(levelname)s %(message)s'
     46         },
     47     },
     48     'handlers': {
     49        'console':{
     50             'level':'NOTSET',
     51             'class':'logging.StreamHandler',
     52             'stream':sys.stderr,
     53             'formatter': 'verbose' #'simple'
     54         },
     55         'file':{
     56             'level':'DEBUG',
     57             'class':'logging.handlers.RotatingFileHandler',
     58             'filename': os.path.join(os.getcwd(), LOG_PATH),
     59             'formatter': 'verbose',
     60             'maxBytes': 1024*1024*20,  # 20MB
     61             'backupCount': 5,
     62         },
     63         'syslog.remote':{
     64             'level':'DEBUG',
     65             'class':'logging.handlers.SysLogHandler',
     66             'address':(SYSLOG_HANDLER_HOST,handlers.SYSLOG_UDP_PORT), # log to syslog or rsyslog server
     67             'formatter': 'verbose',
     68         },
     69         'mail.handler':{
     70             'level':'DEBUG',
     71             'class':'logging.handlers.SMTPHandler', # log to mailbox
     72             'mailhost':MAIL_HANDLER_HOST,
     73             'fromaddr':MAIL_HANDLER_FROMADDR,
     74             'toaddrs':MAIL_HANDLER_TOADDRS,
     75             'subject':MAIL_HANDLER_SUBJECT,
     76             'credentials':MAIL_HANDLER_CREDENTIALS,
     77             'formatter': 'detail',
     78         },
     79         'socket.tcp.handler':{
     80             'level':'DEBUG',
     81             'class':'logging.handlers.SocketHandler', # log to tcp socket
     82             'host':TCPSOCKET_HANDLER_HOST,
     83             'port':TCPSOCKET_HANDLER_PORT,
     84             'formatter': 'verbose',
     85         },
     86         'socket.udp.handler':{
     87             'level':'DEBUG',
     88             'class':'logging.handlers.DatagramHandler', # log to udp socket
     89             'host':UDPSOCKET_HANDLER_HOST,
     90             'port':UDPSOCKET_HANDLER_PORT,
     91             'formatter': 'verbose',
     92         },
     93         'http.handler':{
     94             'level':'DEBUG',
     95             'class':'logging.handlers.HTTPHandler', # log to http server
     96             'host':HTTP_HANDLER_HOST,
     97             'url':HTTP_HANDLER_URL,
     98             'method':HTTP_HANDLER_METHOD,
     99             'formatter': 'verbose',
    100         }
    101     },
    102     'loggers': {
    103         'CommonLogger': {
    104             'handlers': ['console', 'file'] if DEBUG else ['file'],
    105             'level': 'DEBUG' if DEBUG else 'DEBUG', #'INFO'
    106             'propagate': False,
    107             # very important in multithread environment, means disable propagation from current logger to the *root* logger.
    108         },
    109     }
    110 }
    111 
    112 syslog_local = {
    113             'level':'DEBUG',
    114             'class':'logging.handlers.SysLogHandler',
    115             'address':'/dev/log', # log to local syslog file
    116             'formatter': 'verbose',
    117         }
    118 
    119 ntevent_handler = {
    120             'level':'DEBUG',
    121             'class':'logging.handlers.NTEventLogHandler', # log to windows event log
    122             'appname':NTEVENT_HANDLER_APPNAME,
    123             'logtype':NTEVENT_HANDLER_LOGTYPE,
    124             'formatter': 'verbose',
    125         }
    126 
    127 common_logger = {
    128             'handlers': ['console', 'file'] if DEBUG else ['file'],
    129             'level': 'DEBUG' if DEBUG else 'DEBUG', #'INFO'
    130             'propagate': False,
    131             # very important in multithread environment, means disable propagation from current logger to the *root* logger.
    132         }
    133 
    134 
    135 if sys.platform == 'linux2':
    136     LOGGING['handlers']['syslog.local'] = syslog_local
    137 if sys.platform == 'win32':
    138     LOGGING['handlers']['ntevent.handler'] = ntevent_handler
    139 
    140 def getlogger(logger_name=None):
    141     if isinstance(logger_name,str) or isinstance(logger_name,unicode):
    142         LOGGING['loggers'][logger_name] = common_logger
    143         logging.config.dictConfig(LOGGING)
    144         logger = logging.getLogger(logger_name)
    145     else:
    146         logging.config.dictConfig(LOGGING)
    147         logger = logging.getLogger("CommonLogger")
    148         
    149     return logger

    另附上一个接收tcp方式日志的服务器:

     1 import cPickle
     2 import logging
     3 import logging.handlers
     4 import SocketServer
     5 import struct
     6 
     7 
     8 class LogRecordStreamHandler(SocketServer.StreamRequestHandler):
     9     """Handler for a streaming logging request.
    10 
    11     This basically logs the record using whatever logging policy is
    12     configured locally.
    13     """
    14 
    15     def handle(self):
    16         """
    17         Handle multiple requests - each expected to be a 4-byte length,
    18         followed by the LogRecord in pickle format. Logs the record
    19         according to whatever policy is configured locally.
    20         """
    21         while 1:
    22             chunk = self.connection.recv(4)
    23             if len(chunk) < 4:
    24                 break
    25             slen = struct.unpack(">L", chunk)[0]
    26             chunk = self.connection.recv(slen)
    27             while len(chunk) < slen:
    28                 chunk = chunk + self.connection.recv(slen - len(chunk))
    29             obj = self.unPickle(chunk)
    30             record = logging.makeLogRecord(obj)
    31             self.handleLogRecord(record)
    32 
    33     def unPickle(self, data):
    34         return cPickle.loads(data)
    35 
    36     def handleLogRecord(self, record):
    37         # if a name is specified, we use the named logger rather than the one
    38         # implied by the record.
    39         if self.server.logname is not None:
    40             name = self.server.logname
    41         else:
    42             name = record.name
    43         logger = logging.getLogger(name)
    44         # N.B. EVERY record gets logged. This is because Logger.handle
    45         # is normally called AFTER logger-level filtering. If you want
    46         # to do filtering, do it at the client end to save wasting
    47         # cycles and network bandwidth!
    48         logger.handle(record)
    49 
    50 class LogRecordSocketReceiver(SocketServer.ThreadingTCPServer):
    51     """simple TCP socket-based logging receiver suitable for testing.
    52     """
    53 
    54     allow_reuse_address = 1
    55 
    56     def __init__(self, host='localhost',
    57                  port=9022,
    58                  handler=LogRecordStreamHandler):
    59         SocketServer.ThreadingTCPServer.__init__(self, (host, port), handler)
    60         self.abort = 0
    61         self.timeout = 1
    62         self.logname = None
    63 
    64     def serve_until_stopped(self):
    65         import select
    66         abort = 0
    67         while not abort:
    68             rd, wr, ex = select.select([self.socket.fileno()],
    69                                        [], [],
    70                                        self.timeout)
    71             if rd:
    72                 self.handle_request()
    73             abort = self.abort
    74 
    75 def main():
    76     logging.basicConfig(
    77         format="%(levelname)s %(name)s %(asctime)s [%(pathname)s:%(lineno)d] %(message)s")
    78     tcpserver = LogRecordSocketReceiver()
    79     print "About to start TCP server..."
    80     tcpserver.serve_until_stopped()
    81 
    82 if __name__ == "__main__":
    83     main()

    见原文:http://docs.python.org/release/2.4.4/lib/network-logging.html

  • 相关阅读:
    自定义view代码
    省份封装代码
    监听锁屏广播,开启1个像素的Activity
    双进程守护
    新增,查询,删除,修改下方即可
    #Android笔记#解决textview使用SpannableString实现图文混排并设置了行高时,图片与文字显示混乱
    显示地图
    局部页面传值Model
    JS的跳转
    helper实现隐藏前台特效
  • 原文地址:https://www.cnblogs.com/huazi/p/2671200.html
Copyright © 2020-2023  润新知