I am using zope on a Debian GNU/Linux 2.2 system (the zope_2.1.4-3 Debian package). I notice that the access logs are written to a plain text file /var/lib/zope/var/Z2.log. Are there facilities within Zope to cause it to write its logs to a DBMS? I didn't see anything like this in the documentation except for the ability to set ZSYSLOG_SERVER which I don't really think is for the access logs.
Douglas Bates wrote:
I am using zope on a Debian GNU/Linux 2.2 system (the zope_2.1.4-3 Debian package). I notice that the access logs are written to a plain text file /var/lib/zope/var/Z2.log.
Are there facilities within Zope to cause it to write its logs to a DBMS? I didn't see anything like this in the documentation except for the ability to set ZSYSLOG_SERVER which I don't really think is for the access logs.
I have hacked me a way to log info in postgres db by 1. writing a function smart_log(user,path) in a separate module file: PGSQLLogger.py -----8<-----------8<-----------8<-----------8<-----------8<------ import pg,time def smart_log(user,path): f = open('/tmp/Asmartlog.txt','a') f.write(user+path+'\n') f.close() if path[:4] != '/pt/': return if user == '-': return log_time = '%d-%d-%d %d:%s:%d' % time.localtime(time.time())[:6] con = pg.connect('ptweb',user='hannu') path = 'http://www.puidutali.ee%s' % path con.query(""" insert into access_log(access_when,who,what) values('%s','%s','%s')""" % (log_time,user,path)) con.close() -----8<-----------8<-----------8<-----------8<-----------8<------ and then using it from a fixed (current logging mechanisms in Zope2 don't log users ;-O) PCGIServer.py fixed log_request() looks like this: -----8<-----------8<-----------8<-----------8<-----------8<------ def log_request(self, bytes): if self.env.has_key('PATH_INFO'): path=self.env['PATH_INFO'] else: path='%s/' % self.server.module if self.env.has_key('REQUEST_METHOD'): method=self.env['REQUEST_METHOD'] else: method="GET" if self.env.has_key('HTTP_CGI_AUTHORIZATION'): raw_user = self.env['HTTP_CGI_AUTHORIZATION'] if not raw_user: auth_user = '-' else: auth_type, auth_string = string.split(raw_user) if auth_type != 'Basic': auth_user = '?' else: decoded_auth_string = base64.decodestring(auth_string) auth_user = string.split(decoded_auth_string,':')[0] else: auth_user = '-' smart_log(auth_user,path) addr=self.addr if addr and type(addr) is TupleType: self.server.logger.log ( addr[0], ' %d - %s [%s] "%s %s" %d %d' % ( addr[1], auth_user, time.strftime ( '%d/%b/%Y:%H:%M:%S ', time.gmtime(time.time()) ) + tz_for_log, method, path, self.reply_code, bytes ) ) else: self.server.logger.log ( '127.0.0.1', ' - %s [%s] "%s %s" %d %d' % ( auth_user, time.strftime ( '%d/%b/%Y:%H:%M:%S ', time.gmtime(time.time()) ) + tz_for_log, method, path, self.reply_code, bytes ) ) -----8<-----------8<-----------8<-----------8<-----------8<------ if you are using any other *Server.py-s you will have to add extracting the user info yourself. Possibly you must also fix the log format as it may be broken (as it was in PCGIServer.py) ------------------------ Hannu
participants (2)
-
Douglas Bates -
Hannu Krosing