|
支持文件、屏幕打印、电子邮件、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 |
|