Index: doc/src/sgml/runtime.sgml =================================================================== RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/runtime.sgml,v retrieving revision 1.235 diff -c -r1.235 runtime.sgml *** doc/src/sgml/runtime.sgml 27 Jan 2004 16:51:43 -0000 1.235 --- doc/src/sgml/runtime.sgml 2 Feb 2004 19:08:42 -0000 *************** *** 1825,1830 **** --- 1825,1844 ---- + log_disconnections (boolean) + + + This outputs a line to the server logs similar to LOG_CONNECTIONS + but at the end of a session, and including the duration of the + session.This is off by default. This option can only be set at + server start or in the postgresql.conf + configuration file. + + + + + + log_duration (boolean) Index: src/backend/postmaster/postmaster.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v retrieving revision 1.364 diff -c -r1.364 postmaster.c *** src/backend/postmaster/postmaster.c 28 Jan 2004 21:02:40 -0000 1.364 --- src/backend/postmaster/postmaster.c 2 Feb 2004 19:08:43 -0000 *************** *** 2438,2443 **** --- 2438,2450 ---- * Signal handlers setting is moved to tcop/postgres... */ + /* save start time for end of session reporting */ + gettimeofday(&(port->session_start),NULL); + + /* set these to empty in case they are needed before we set them up */ + port->remote_host = ""; + port->remote_port = ""; + /* Save port etc. for ps status */ MyProcPort = port; *************** *** 2492,2497 **** --- 2499,2510 ---- snprintf(tmphost, sizeof(tmphost), "%s:%s", remote_host, remote_port); StrNCpy(remote_host, tmphost, sizeof(remote_host)); } + + /* + * save remote_host and remote_port in port stucture + */ + port->remote_host = strdup(remote_host); + port->remote_port = strdup(remote_port); /* * Ready to begin client interaction. We will give up and exit(0) Index: src/backend/tcop/postgres.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/tcop/postgres.c,v retrieving revision 1.387 diff -c -r1.387 postgres.c *** src/backend/tcop/postgres.c 28 Jan 2004 21:02:40 -0000 1.387 --- src/backend/tcop/postgres.c 2 Feb 2004 19:08:43 -0000 *************** *** 84,89 **** --- 84,92 ---- bool Warn_restart_ready = false; bool InError = false; + /* flag for logging end of session */ + bool Log_disconnections = false; + /* * Flags for expensive function optimization -- JMH 3/9/92 */ *************** *** 149,154 **** --- 152,158 ---- static void finish_xact_command(void); static void SigHupHandler(SIGNAL_ARGS); static void FloatExceptionHandler(SIGNAL_ARGS); + static void log_session_end(void); /* ---------------------------------------------------------------- *************** *** 2406,2412 **** --- 2410,2419 ---- * other output options. */ if (debug_flag >= 1) + { SetConfigOption("log_connections", "true", debug_context, gucsource); + SetConfigOption("log_disconnections", "true", debug_context, gucsource); + } if (debug_flag >= 2) SetConfigOption("log_statement", "true", debug_context, gucsource); if (debug_flag >= 3) *************** *** 2435,2440 **** --- 2442,2453 ---- gucopts = lnext(gucopts); SetConfigOption(name, value, PGC_BACKEND, PGC_S_CLIENT); } + + /* + * set up handler to log session end. + */ + if (IsUnderPostmaster && Log_disconnections) + on_proc_exit(log_session_end,0); } /* *************** *** 3172,3175 **** --- 3185,3246 ---- errdetail("%s", str.data))); pfree(str.data); + } + + /* + * on_proc_exit handler to log end of session + */ + static void + log_session_end(void) + { + Port * port = MyProcPort; + struct timeval end; + int hours, minutes, seconds; + + char session_time[20]; + char uname[6+NAMEDATALEN]; + char dbname[10+NAMEDATALEN]; + char remote_host[7 + NI_MAXHOST]; + char remote_port[7 + NI_MAXSERV]; + + snprintf(uname, sizeof(uname)," user=%s",port->user_name); + snprintf(dbname, sizeof(dbname)," database=%s",port->database_name); + snprintf(remote_host,sizeof(remote_host)," host=%s", + port->remote_host); + /* prevent redundant or empty reporting of port */ + if (!LogSourcePort && strlen(port->remote_port)) + snprintf(remote_port,sizeof(remote_port)," port=%s",port->remote_port); + else + remote_port[0] = '\0'; + + + gettimeofday(&end,NULL); + + if (end.tv_usec < port->session_start.tv_usec) + { + end.tv_sec--; + end.tv_usec += 1000000; + } + end.tv_sec -= port->session_start.tv_sec; + end.tv_usec -= port->session_start.tv_usec; + + hours = end.tv_sec / 3600; + end.tv_sec %= 3600; + minutes = end.tv_sec / 60; + seconds = end.tv_sec % 60; + + /* if time has gone backwards for some reason say so, or print time */ + + if (end.tv_sec < 0) + snprintf(session_time,sizeof(session_time),"negative!"); + else + /* for stricter accuracy here we could round - this is close enough */ + snprintf(session_time, sizeof(session_time),"%d:%02d:%02d.%02ld", + hours, minutes, seconds, end.tv_usec/10000); + + ereport( + LOG, + (errmsg("disconnection: session time: %s%s%s%s%s", + session_time,uname,dbname,remote_host,remote_port))); + } Index: src/backend/utils/misc/guc.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v retrieving revision 1.182 diff -c -r1.182 guc.c *** src/backend/utils/misc/guc.c 31 Jan 2004 05:09:41 -0000 1.182 --- src/backend/utils/misc/guc.c 2 Feb 2004 19:08:44 -0000 *************** *** 65,70 **** --- 65,71 ---- /* XXX these should appear in other modules' header files */ extern bool Log_connections; + extern bool Log_disconnections; extern bool check_function_bodies; extern int PreAuthDelay; extern int AuthenticationTimeout; *************** *** 499,504 **** --- 500,513 ---- NULL }, &Log_connections, + false, NULL, NULL + }, + { + {"log_disconnections", PGC_BACKEND, LOGGING_WHAT, + gettext_noop("Logs end of a session, including duration"), + NULL + }, + &Log_disconnections, false, NULL, NULL }, { Index: src/backend/utils/misc/postgresql.conf.sample =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/postgresql.conf.sample,v retrieving revision 1.101 diff -c -r1.101 postgresql.conf.sample *** src/backend/utils/misc/postgresql.conf.sample 24 Jan 2004 20:00:45 -0000 1.101 --- src/backend/utils/misc/postgresql.conf.sample 2 Feb 2004 19:08:44 -0000 *************** *** 179,184 **** --- 179,185 ---- #debug_print_plan = false #debug_pretty_print = false #log_connections = false + #log_disconnections = false #log_duration = false #log_pid = false #log_statement = false Index: src/include/libpq/libpq-be.h =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/include/libpq/libpq-be.h,v retrieving revision 1.39 diff -c -r1.39 libpq-be.h *** src/include/libpq/libpq-be.h 20 Dec 2003 17:31:21 -0000 1.39 --- src/include/libpq/libpq-be.h 2 Feb 2004 19:08:45 -0000 *************** *** 47,52 **** --- 47,55 ---- ProtocolVersion proto; /* FE/BE protocol version */ SockAddr laddr; /* local addr (postmaster) */ SockAddr raddr; /* remote addr (client) */ + char *remote_host; /* name (or ip addr) of remote host */ + char *remote_port; /* text rep of remote port */ + struct timeval session_start; /* for session duration logging */ CAC_state canAcceptConnections; /* postmaster connection status */ /*