g87616758 发表于 2015-4-27 07:48:54

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'] = 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)
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(,
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
页: [1]
查看完整版本: python logging 模块完整使用示例