设为首页 收藏本站
查看: 842|回复: 0

[经验分享] python logging 模块完整使用示例

[复制链接]

尚未签到

发表于 2015-4-27 07:48:54 | 显示全部楼层 |阅读模式
  支持文件、屏幕打印、电子邮件、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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60927-1-1.html 上篇帖子: python pexpect 学习与探索 下篇帖子: 一个Python-GTK的程序,用来关机,重启
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表