diff --git a/src/sbbs3/ftpsrvr.c b/src/sbbs3/ftpsrvr.c
index 3c5350cc0a8ad312438a3c5576be6bd2cdfa4e11..e25129735882b37ef4d5c46660e42f3916b4564a 100644
--- a/src/sbbs3/ftpsrvr.c
+++ b/src/sbbs3/ftpsrvr.c
@@ -1268,7 +1268,7 @@ static void filexfer(union xp_sockaddr* addr, SOCKET ctrl_sock, CRYPT_SESSION ct
 
 		addr_len = sizeof(server_addr);
 		if((result=getsockname(ctrl_sock, &server_addr.addr,&addr_len))!=0) {
-			lprintf(LOG_ERR,"%04d <%s> !DATA ERROR %d (%d) getting address/port of command socket (%u)"
+			lprintf(LOG_CRIT,"%04d <%s> !DATA ERROR %d (%d) getting address/port of command socket (%u)"
 				,ctrl_sock, user->alias,result,ERROR_VALUE,pasv_sock);
 			return;
 		}
@@ -1324,7 +1324,7 @@ static void filexfer(union xp_sockaddr* addr, SOCKET ctrl_sock, CRYPT_SESSION ct
 		if(startup->options&FTP_OPT_DEBUG_DATA) {
 			addr_len=sizeof(*addr);
 			if((result=getsockname(pasv_sock, &addr->addr,&addr_len))!=0)
-				lprintf(LOG_ERR,"%04d <%s> PASV !DATA ERROR %d (%d) getting address/port of passive socket (%u)"
+				lprintf(LOG_CRIT,"%04d <%s> PASV !DATA ERROR %d (%d) getting address/port of passive socket (%u)"
 					,ctrl_sock, user->alias,result,ERROR_VALUE,pasv_sock);
 			else
 				lprintf(LOG_DEBUG,"%04d <%s> PASV DATA socket %d listening on %s port %u"
@@ -2221,7 +2221,7 @@ static void ctrl_thread(void* arg)
 	/* Default data port is ctrl port-1 */
 	data_port = inet_addrport(&data_addr)-1;
 
-	lprintf(LOG_DEBUG,"%04d CTRL thread started", sock);
+	lprintf(LOG_DEBUG,"%04d Session thread started", sock);
 
 	free(arg);
 
@@ -2249,23 +2249,36 @@ static void ctrl_thread(void* arg)
 
 	inet_addrtop(&ftp.client_addr, host_ip, sizeof(host_ip));
 
-	lprintf(LOG_INFO,"%04d CTRL connection accepted from: %s port %u"
-		,sock, host_ip, inet_addrport(&ftp.client_addr));
+	union xp_sockaddr local_addr;
+	memset(&local_addr, 0, sizeof(local_addr));
+	addr_len = sizeof(local_addr);
+	if(getsockname(sock, (struct sockaddr *)&local_addr, &addr_len) != 0) {
+		lprintf(LOG_CRIT,"%04d [%s] !ERROR %d getting local address/port of socket"
+			,sock, host_ip, ERROR_VALUE);
+		ftp_close_socket(&sock,&sess,__LINE__);
+		thread_down();
+		return;
+	}
+	char local_ip[INET6_ADDRSTRLEN];
+	inet_addrtop(&local_addr, local_ip, sizeof local_ip);
+
+	lprintf(LOG_INFO,"%04d [%s] Connection accepted on %s port %u from port %u"
+		,sock, host_ip, local_ip, inet_addrport(&local_addr), inet_addrport(&ftp.client_addr));
 
 	SAFECOPY(host_name, STR_NO_HOSTNAME);
 	if(!(startup->options&FTP_OPT_NO_HOST_LOOKUP)) {
 		getnameinfo(&ftp.client_addr.addr, sizeof(ftp.client_addr), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD);
-		lprintf(LOG_INFO,"%04d Hostname: %s [%s]", sock, host_name, host_ip);
+		lprintf(LOG_INFO,"%04d [%s] Hostname: %s", sock, host_ip, host_name);
 	}
 
 	ulong banned = loginBanned(&scfg, startup->login_attempt_list, sock, host_name, startup->login_attempt, &attempted);
 	if(banned || trashcan(&scfg,host_ip,"ip")) {
 		if(banned) {
 			char ban_duration[128];
-			lprintf(LOG_NOTICE, "%04d !TEMPORARY BAN of %s (%lu login attempts, last: %s) - remaining: %s"
+			lprintf(LOG_NOTICE, "%04d [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s"
 				,sock, host_ip, attempted.count-attempted.dupes, attempted.user, seconds_to_str(banned, ban_duration));
 		} else
-			lprintf(LOG_NOTICE,"%04d !CLIENT BLOCKED in ip.can: %s", sock, host_ip);
+			lprintf(LOG_NOTICE,"%04d [%s] !CLIENT BLOCKED in ip.can", sock, host_ip);
 		sockprintf(sock,sess,"550 Access denied.");
 		ftp_close_socket(&sock,&sess,__LINE__);
 		thread_down();
@@ -2273,7 +2286,7 @@ static void ctrl_thread(void* arg)
 	}
 
 	if(trashcan(&scfg,host_name,"host")) {
-		lprintf(LOG_NOTICE,"%04d !CLIENT BLOCKED in host.can: %s", sock, host_name);
+		lprintf(LOG_NOTICE,"%04d [%s] !CLIENT BLOCKED in host.can: %s", sock, host_ip, host_name);
 		sockprintf(sock,sess,"550 Access denied.");
 		ftp_close_socket(&sock,&sess,__LINE__);
 		thread_down();
@@ -2283,7 +2296,7 @@ static void ctrl_thread(void* arg)
 	/* For PASV mode */
 	addr_len=sizeof(pasv_addr);
 	if((result=getsockname(sock, &pasv_addr.addr,&addr_len))!=0) {
-		lprintf(LOG_ERR,"%04d !ERROR %d (%d) getting address/port", sock, result, ERROR_VALUE);
+		lprintf(LOG_CRIT,"%04d !ERROR %d (%d) getting address/por of socket", sock, result, ERROR_VALUE);
 		sockprintf(sock,sess,"425 Error %d getting address/port",ERROR_VALUE);
 		ftp_close_socket(&sock,&sess,__LINE__);
 		thread_down();
@@ -2973,7 +2986,7 @@ static void ctrl_thread(void* arg)
 
 			addr_len=sizeof(addr);
 			if((result=getsockname(pasv_sock, &addr.addr,&addr_len))!=0) {
-				lprintf(LOG_ERR,"%04d <%s> !PASV ERROR %d (%d) getting address/port"
+				lprintf(LOG_CRIT,"%04d <%s> !PASV ERROR %d (%d) getting address/port of socket"
 					,sock, user.alias, result, ERROR_VALUE);
 				sockprintf(sock,sess,"425 Error %d getting address/port",ERROR_VALUE);
 				ftp_close_socket(&pasv_sock,&pasv_sess,__LINE__);
@@ -4889,8 +4902,8 @@ static void ctrl_thread(void* arg)
 		int32_t	threads = thread_down();
 		update_clients();
 
-		lprintf(LOG_INFO,"%04d CTRL thread terminated (%d clients and %d threads remain, %lu served)"
-			,sock, clients, threads, served);
+		lprintf(LOG_INFO,"%04d [%s] Session thread terminated (%d clients and %d threads remain, %lu served)"
+			,sock, host_ip, clients, threads, served);
 	}
 }
 
diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index c683348619a68834fb09cb2fee2e87fd733e568e..b68fd8c24512fc9eff4018c57f72c9fdb1d145e3 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -1050,7 +1050,7 @@ static bool pop3_client_thread(pop3_t* pop3)
 
 	socklen_t addr_len = sizeof(server_addr);
 	if((i=getsockname(socket, &server_addr.addr, &addr_len))!=0) {
-		lprintf(LOG_CRIT,"%04d %s !ERROR %d (%d) getting address/port"
+		lprintf(LOG_CRIT,"%04d %s !ERROR %d (%d) getting local address/port of socket"
 			,socket, client.protocol, i, ERROR_VALUE);
 		return false;
 	}
@@ -1059,7 +1059,7 @@ static bool pop3_client_thread(pop3_t* pop3)
 	inet_addrtop(&server_addr, server_ip, sizeof(server_ip));
 
 	if(startup->options&MAIL_OPT_DEBUG_POP3)
-		lprintf(LOG_INFO,"%04d %s [%s] connection accepted on %s port %u from port %u"
+		lprintf(LOG_INFO,"%04d %s [%s] Connection accepted on %s port %u from port %u"
 			,socket, client.protocol, host_ip, server_ip, inet_addrport(&server_addr), inet_addrport(&pop3->client_addr));
 
 	SAFECOPY(host_name, STR_NO_HOSTNAME);
@@ -1738,7 +1738,7 @@ static bool pop3_client_thread(pop3_t* pop3)
 	{
 		int32_t remain = thread_down();
 		if(startup->options&MAIL_OPT_DEBUG_POP3)
-			lprintf(LOG_DEBUG,"%04d %s [%s] session thread terminated (%u threads remain, %lu clients served)"
+			lprintf(LOG_DEBUG,"%04d %s [%s] Session thread terminated (%u threads remain, %lu clients served)"
 				,socket, client.protocol, host_ip, remain, ++stats.pop3_served);
 	}
 	return true;
@@ -2945,7 +2945,7 @@ static bool smtp_client_thread(smtp_t* smtp)
 	addr_len=sizeof(server_addr);
 
 	if((i=getsockname(socket, &server_addr.addr, &addr_len))!=0) {
-		lprintf(LOG_CRIT, "%04d %s !ERROR %d (%d) getting address/port"
+		lprintf(LOG_CRIT, "%04d %s !ERROR %d (%d) getting address/port of socket"
 			,socket, client.protocol, i, ERROR_VALUE);
 		return false;
 	}
diff --git a/src/sbbs3/main.cpp b/src/sbbs3/main.cpp
index 171de80fd7a6b91a288cb8b4434d3fab3e6f6197..9379198e39518365d93aef95c5b40a2f8bff6e89 100644
--- a/src/sbbs3/main.cpp
+++ b/src/sbbs3/main.cpp
@@ -3452,7 +3452,7 @@ bool sbbs_t::init()
 
 		addr_len=sizeof(addr);
 		if((result=getsockname(client_socket, &addr.addr, &addr_len))!=0) {
-			lprintf(LOG_ERR,"!ERROR %d (%d) getting address/port"
+			lprintf(LOG_CRIT,"!ERROR %d (%d) getting local address/port of socket"
 				,result, ERROR_VALUE);
 			return(false);
 		}
@@ -3471,8 +3471,6 @@ bool sbbs_t::init()
 			fprintf(fp, "local_port=%u\n", (uint)inet_addrport(&addr));
 			fclose(fp);
 		}
-		lprintf(LOG_INFO,"socket %u attached to local interface %s port %u"
-			,client_socket, local_addr, inet_addrport(&addr));
 		spymsg("Connected");
 	}
 
@@ -5299,14 +5297,26 @@ NO_SSH:
 			continue;
 		}
 
+
 #ifdef USE_CRYPTLIB
 		client.protocol=rlogin ? "RLogin":(ssh ? "SSH" : "Telnet");
 #else
 		client.protocol=rlogin ? "RLogin":"Telnet";
 #endif
-		lprintf(LOG_INFO,"%04d %s connection accepted from: %s port %u"
-			,client_socket, client.protocol
-			, host_ip, inet_addrport(&client_addr));
+		union xp_sockaddr local_addr;
+		memset(&local_addr, 0, sizeof(local_addr));
+		socklen_t addr_len = sizeof(local_addr);
+		if(getsockname(client_socket, (struct sockaddr *)&local_addr, &addr_len) != 0) {
+			lprintf(LOG_CRIT,"%04d %s [%s] !ERROR %d getting local address/port of socket"
+				,client_socket, client.protocol, host_ip, ERROR_VALUE);
+			close_socket(client_socket);
+			continue;
+		}
+		char local_ip[INET6_ADDRSTRLEN];
+		inet_addrtop(&local_addr, local_ip, sizeof local_ip);
+
+		lprintf(LOG_INFO,"%04d %s [%s] Connection accepted on %s port %u from port %u"
+			,client_socket, client.protocol, host_ip, local_ip, inet_addrport(&local_addr), inet_addrport(&client_addr));
 
 		if(startup->max_concurrent_connections > 0) {
 			int ip_len = strlen(host_ip)+1;
@@ -5331,11 +5341,11 @@ NO_SSH:
 		if(banned || sbbs->trashcan(host_ip,"ip")) {
 			if(banned) {
 				char ban_duration[128];
-				lprintf(LOG_NOTICE, "%04d %s !TEMPORARY BAN of %s (%lu login attempts%s%s) - remaining: %s"
+				lprintf(LOG_NOTICE, "%04d %s [%s] !TEMPORARY BAN (%lu login attempts%s%s) - remaining: %s"
 					,client_socket, client.protocol, host_ip, attempted.count-attempted.dupes
 					,attempted.user[0] ? ", last: " : "", attempted.user, seconds_to_str(banned, ban_duration));
 			} else
-				lprintf(LOG_NOTICE,"%04d %s !CLIENT BLOCKED in ip.can: %s", client_socket, client.protocol, host_ip);
+				lprintf(LOG_NOTICE,"%04d %s [%s] !CLIENT BLOCKED in ip.can", client_socket, client.protocol, host_ip);
 			close_socket(client_socket);
 			continue;
 		}
@@ -5410,7 +5420,7 @@ NO_SSH:
 							i=cryptGetAttributeString(sbbs->ssh_session, CRYPT_SESSINFO_SSH_CHANNEL_TYPE, tname, &tnamelen);
 							GCESS(i, client_socket, sbbs->ssh_session, "getting channel type");
 							if (tnamelen != 7 || strnicmp(tname, "session", 7)) {
-								lprintf(LOG_NOTICE, "%04d SSH active channel '%.*s' is not 'session', disconnecting.", client_socket, tnamelen, tname);
+								lprintf(LOG_NOTICE, "%04d SSH [%s] active channel '%.*s' is not 'session', disconnecting.", client_socket, host_ip, tnamelen, tname);
 								sbbs->badlogin(/* user: */NULL, /* passwd: */NULL, "SSH", &client_addr, /* delay: */false);
 								// Fail because there's no session.
 								ssh_failed = 3;
@@ -5422,7 +5432,7 @@ NO_SSH:
 					else {
 						GCESS(i, client_socket, sbbs->ssh_session, "getting channel id");
 						if (i == CRYPT_ERROR_PERMISSION)
-							lprintf(LOG_ERR, "!ERROR Your cryptlib build is obsolete, please update");
+							lprintf(LOG_CRIT, "!Your cryptlib build is obsolete, please update");
 					}
 					break;
 				}
@@ -5434,7 +5444,7 @@ NO_SSH:
 				}
 			}
 			if(ssh_failed) {
-				lprintf(LOG_INFO, "%04d SSH session establishment failed", client_socket);
+				lprintf(LOG_NOTICE, "%04d SSH [%s] session establishment failed", client_socket, host_ip);
 				SSH_END(client_socket);
 				close_socket(client_socket);
 				continue;
@@ -5459,12 +5469,7 @@ NO_SSH:
 
 		sbbs->autoterm=0;
 		sbbs->cols = startup->default_term_width;
-		union xp_sockaddr local_addr;
-		memset(&local_addr, 0, sizeof(local_addr));
-		socklen_t addr_len=sizeof(local_addr);
-		if(getsockname(client_socket, (struct sockaddr *)&local_addr, &addr_len) == 0
-			&& (inet_addrport(&local_addr) == startup->pet40_port
-				|| inet_addrport(&local_addr) == startup->pet80_port)) {
+		if (inet_addrport(&local_addr) == startup->pet40_port || inet_addrport(&local_addr) == startup->pet80_port) {
 			sbbs->autoterm = PETSCII;
 			sbbs->cols = inet_addrport(&local_addr) == startup->pet40_port ? 40 : 80;
 			sbbs->outcom(PETSCII_UPPERLOWER);
@@ -5478,14 +5483,14 @@ NO_SSH:
 			sbbs->bprintf("Resolving hostname...");
 			getnameinfo(&client_addr.addr, client_addr_len, host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD);
 			sbbs->putcom(crlf);
-			lprintf(LOG_INFO,"%04d %s Hostname: %s [%s]", client_socket, client.protocol, host_name, host_ip);
+			lprintf(LOG_INFO,"%04d %s [%s] Hostname: %s", client_socket, client.protocol, host_ip, host_name);
 		}
 
 		if(sbbs->trashcan(host_name,"host")) {
 			SSH_END(client_socket);
 			close_socket(client_socket);
-			lprintf(LOG_NOTICE,"%04d %s !CLIENT BLOCKED in host.can: %s"
-				,client_socket, client.protocol, host_name);
+			lprintf(LOG_NOTICE,"%04d %s [%s] !CLIENT BLOCKED in host.can: %s"
+				,client_socket, client.protocol, host_ip, host_name);
 			continue;
 		}
 
@@ -5494,13 +5499,13 @@ NO_SSH:
 			sbbs->bprintf("Resolving identity...");
 			/* ToDo: Make ident timeout configurable */
 			if(identify(&client_addr, inet_addrport(&client_addr), str, sizeof(str)-1, /* timeout: */1)) {
-				lprintf(LOG_DEBUG,"%04d %s Ident Response: %s",client_socket, client.protocol, str);
+				lprintf(LOG_DEBUG,"%04d %s [%s] Ident Response: %s",client_socket, client.protocol, host_ip, str);
 				identity=strrchr(str,':');
 				if(identity!=NULL) {
 					identity++;	/* skip colon */
 					SKIP_WHITESPACE(identity);
 					if(*identity)
-						lprintf(LOG_INFO,"%04d %s Identity: %s",client_socket, client.protocol, identity);
+						lprintf(LOG_INFO,"%04d %s [%s] Identity: %s",client_socket, client.protocol, host_ip, identity);
 				}
 			}
 			sbbs->putcom(crlf);
@@ -5545,7 +5550,7 @@ NO_SSH:
 		}
 
 		if(i>last_node) {
-			lprintf(LOG_WARNING,"%04d %s !No nodes available for login.", client_socket, client.protocol);
+			lprintf(LOG_WARNING,"%04d %s [%s] !No nodes available for login.", client_socket, client.protocol, host_ip);
 			SAFEPRINTF(str,"%snonodes.txt",scfg.text_dir);
 			if(fexist(str))
 				sbbs->printfile(str,P_NOABORT);
@@ -5560,6 +5565,8 @@ NO_SSH:
 			continue;
 		}
 
+		lprintf(LOG_INFO, "%04d %s [%s] Attaching to Node %d", client_socket, client.protocol, host_ip, i);
+
 		// Load the configuration files for this node, only if/when needed/updated
 		scfg_t* cfg = &node_scfg[i - 1];
 		if(cfg->size != sizeof(*cfg) || (node.misc & NODE_RRUN)) {
@@ -5690,7 +5697,7 @@ NO_SSH:
 
 			tmp_addr_len=sizeof(tmp_addr);
 			if(getsockname(tmp_sock, (struct sockaddr *)&tmp_addr, &tmp_addr_len)) {
-				lprintf(LOG_ERR,"Node %d !ERROR %d getting passthru listener address"
+				lprintf(LOG_CRIT,"Node %d !ERROR %d getting passthru listener address/port of socket"
 					,new_node->cfg.node_num, ERROR_VALUE);
 				close_socket(tmp_sock);
 				goto NO_PASSTHRU;
diff --git a/src/sbbs3/services.c b/src/sbbs3/services.c
index 3e601cb68243c96126c7ca74853d952a27eb4906..56174cbb5537513637c0346583cac20d14dcc518 100644
--- a/src/sbbs3/services.c
+++ b/src/sbbs3/services.c
@@ -1042,31 +1042,30 @@ static void js_service_thread(void* arg)
 
 	socket=service_client.socket;
 	service=service_client.service;
+	inet_addrtop(&service_client.addr, client.addr, sizeof(client.addr));
 
 	if(service->log_level >= LOG_DEBUG)
-		lprintf(LOG_DEBUG,"%04d %s JavaScript service thread started", socket, service->protocol);
+		lprintf(LOG_DEBUG,"%04d %s [%s] JavaScript service thread started", socket, service->protocol, client.addr);
 
 	SetThreadName("sbbs/jsService");
 	thread_up(TRUE /* setuid */);
 	sbbs_srand();	/* Seed random number generator */
 	protected_uint32_adjust(&threads_pending_start, -1);
 
-	inet_addrtop(&service_client.addr, client.addr, sizeof(client.addr));
-
 	/* Host name lookup and filtering */
 	SAFECOPY(host_name, STR_NO_HOSTNAME);
 	if(!(service->options&BBS_OPT_NO_HOST_LOOKUP)
 		&& !(startup->options&BBS_OPT_NO_HOST_LOOKUP)) {
 		getnameinfo(&service_client.addr.addr, xp_sockaddr_len(&service_client), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD);
 		if(service->log_level >= LOG_INFO)
-			lprintf(LOG_INFO,"%04d %s Hostname: %s [%s]"
-				,socket, service->protocol, host_name, client.addr);
+			lprintf(LOG_INFO,"%04d %s [%s] Hostname: %s"
+				,socket, service->protocol, client.addr, host_name);
 	}
 
 	if(trashcan(&scfg,host_name,"host")) {
 		if(service->log_level >= LOG_NOTICE)
-			lprintf(LOG_NOTICE,"%04d %s !CLIENT BLOCKED in host.can: %s"
-				,socket, service->protocol, host_name);
+			lprintf(LOG_NOTICE,"%04d %s [%s] !CLIENT BLOCKED in host.can: %s"
+				,socket, service->protocol, client.addr, host_name);
 		close_socket(socket);
 		protected_uint32_adjust(&service->clients, -1);
 		thread_down();
@@ -1160,7 +1159,7 @@ static void js_service_thread(void* arg)
 	if(startup->login_attempt.throttle
 		&& (login_attempts=loginAttempts(startup->login_attempt_list, &service_client.addr)) > 1) {
 		if(service->log_level >= LOG_DEBUG)
-			lprintf(LOG_DEBUG,"%04d %s Throttling suspicious connection from: %s (%lu login attempts)"
+			lprintf(LOG_DEBUG,"%04d %s [%s] Throttling suspicious connection (%lu login attempts)"
 				,socket, service->protocol, client.addr, login_attempts);
 		mswait(login_attempts*startup->login_attempt.throttle);
 	}
@@ -1215,8 +1214,8 @@ static void js_service_thread(void* arg)
 		if(service_client.subscan!=NULL)
 			putmsgptrs(&scfg, &service_client.user, service_client.subscan);
 		if(service->log_level >= LOG_INFO)
-			lprintf(LOG_INFO,"%04d %s Logging out %s"
-				,socket, service->protocol, service_client.user.alias);
+			lprintf(LOG_INFO,"%04d %s [%s] Logging out %s"
+				,socket, service->protocol, client.addr, service_client.user.alias);
 		logoutuserdat(&scfg,&service_client.user,time(NULL),service_client.logintime);
 
 #ifdef _WIN32
@@ -1238,8 +1237,8 @@ static void js_service_thread(void* arg)
 
 	thread_down();
 	if(service->log_level >= LOG_INFO)
-		lprintf(LOG_INFO,"%04d %s service thread terminated (%lu clients remain, %lu total, %lu served)"
-			,socket, service->protocol, remain, active_clients(), service->served);
+		lprintf(LOG_INFO,"%04d %s [%s] JavaScript service thread terminated (%lu clients remain, %lu total, %lu served)"
+			,socket, service->protocol, client.addr, remain, active_clients(), service->served);
 
 	client_off(socket);
 	close_socket(socket);
@@ -1346,7 +1345,7 @@ static void js_static_service_thread(void* arg)
 
 	thread_down();
 	if(service->log_level >= LOG_INFO)
-		lprintf(LOG_INFO,"%s service thread terminated (%lu clients served)"
+		lprintf(LOG_INFO,"%s static JavaScript service thread terminated (%lu clients served)"
 			, service->protocol, service->served);
 
 	xpms_destroy(service->set, close_socket_cb, service);
@@ -1422,7 +1421,7 @@ static void native_static_service_thread(void* arg)
 
 	thread_down();
 	if(inst.service->log_level >= LOG_INFO)
-		lprintf(LOG_INFO,"%04d %s service thread terminated (%lu clients served)"
+		lprintf(LOG_INFO,"%04d %s static service thread terminated (%lu clients served)"
 			,inst.socket, service->protocol, service->served);
 
 	close_socket(inst.socket);
@@ -1462,8 +1461,8 @@ static void native_service_thread(void* arg)
 	if(!(service->options&BBS_OPT_NO_HOST_LOOKUP)
 		&& !(startup->options&BBS_OPT_NO_HOST_LOOKUP)) {
 		getnameinfo(&service_client.addr.addr, xp_sockaddr_len(&service_client), host_name, sizeof(host_name), NULL, 0, NI_NAMEREQD);
-		lprintf(LOG_INFO,"%04d %s Hostname: %s [%s]"
-			,socket, service->protocol, host_name, client.addr);
+		lprintf(LOG_INFO,"%04d %s [%s] Hostname: %s"
+			,socket, service->protocol, client.addr, host_name);
 #if	0 /* gethostbyaddr() is apparently not (always) thread-safe
 	     and getnameinfo() doesn't return alias information */
 		for(i=0;host!=NULL && host->h_aliases!=NULL
@@ -1474,8 +1473,8 @@ static void native_service_thread(void* arg)
 	}
 
 	if(trashcan(&scfg,host_name,"host")) {
-		lprintf(LOG_NOTICE,"%04d %s !CLIENT BLOCKED in host.can: %s"
-			,socket, service->protocol, host_name);
+		lprintf(LOG_NOTICE,"%04d %s [%s] !CLIENT BLOCKED in host.can: %s"
+			,socket, service->protocol, client.addr, host_name);
 		close_socket(socket);
 		protected_uint32_adjust(&service->clients, -1);
 		thread_down();
@@ -2302,10 +2301,27 @@ void services_thread(void* arg)
 						continue;
 					}
 
+					union xp_sockaddr local_addr;
+					memset(&local_addr, 0, sizeof(local_addr));
+					socklen_t addr_len = sizeof(local_addr);
+					if(getsockname(client_socket, (struct sockaddr *)&local_addr, &addr_len) != 0) {
+						lprintf(LOG_CRIT,"%04d %s [%s] !ERROR %d getting local address/port of socket"
+							,client_socket, service[i].protocol, host_ip, ERROR_VALUE);
+						FREE_AND_NULL(udp_buf);
+						close_socket(client_socket);
+						continue;
+					}
+					char local_ip[INET6_ADDRSTRLEN];
+					inet_addrtop(&local_addr, local_ip, sizeof local_ip);
+
 					if(service[i].log_level >= LOG_INFO)
-						lprintf(LOG_INFO,"%04d %s connection accepted from: %s port %u"
+						lprintf(LOG_INFO,"%04d %s [%s] Connection accepted on %s port %u from port %u"
 							,client_socket
-							,service[i].protocol, host_ip, inet_addrport(&client_addr));
+							,service[i].protocol
+							,host_ip
+							,local_ip
+							,inet_addrport(&local_addr)
+							,inet_addrport(&client_addr));
 
 					if(service[i].max_clients && protected_uint32_value(service[i].clients) + 1 > service[i].max_clients) {
 						FREE_AND_NULL(udp_buf);
@@ -2320,10 +2336,10 @@ void services_thread(void* arg)
 					if(banned || trashcan(&scfg,host_ip,"ip")) {
 						if(banned) {
 							char ban_duration[128];
-							lprintf(LOG_NOTICE, "%04d !TEMPORARY BAN of %s (%lu login attempts, last: %s) - remaining: %s"
+							lprintf(LOG_NOTICE, "%04d [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s"
 								,client_socket, host_ip, attempted.count-attempted.dupes, attempted.user, seconds_to_str(banned, ban_duration));
 						} else
-							lprintf(LOG_NOTICE,"%04d %s !CLIENT BLOCKED in ip.can: %s"
+							lprintf(LOG_NOTICE,"%04d %s [%s] !CLIENT BLOCKED in ip.can"
 								,client_socket, service[i].protocol, host_ip);
 						FREE_AND_NULL(udp_buf);
 						close_socket(client_socket);
diff --git a/src/sbbs3/websrvr.c b/src/sbbs3/websrvr.c
index ce0b7a704643ac69a3bad0e385110ab2dbd0f860..fc617e153c88585d0942f3efabb0a2ea8c9e4412 100644
--- a/src/sbbs3/websrvr.c
+++ b/src/sbbs3/websrvr.c
@@ -6680,11 +6680,11 @@ void http_session_thread(void* arg)
 	if(banned || trashcan(&scfg,session.host_ip,"ip")) {
 		if(banned) {
 			char ban_duration[128];
-			lprintf(LOG_NOTICE, "%04d %s !TEMPORARY BAN of %s (%lu login attempts, last: %s) - remaining: %s"
+			lprintf(LOG_NOTICE, "%04d %s [%s] !TEMPORARY BAN (%lu login attempts, last: %s) - remaining: %s"
 				,session.socket, session.client.protocol
 				,session.host_ip, attempted.count-attempted.dupes, attempted.user, seconds_to_str(banned, ban_duration));
 		} else
-			lprintf(LOG_NOTICE, "%04d %s !CLIENT BLOCKED in ip.can: %s", session.socket, session.client.protocol, session.host_ip);
+			lprintf(LOG_NOTICE, "%04d %s [%s] !CLIENT BLOCKED in ip.can", session.socket, session.client.protocol, session.host_ip);
 		close_session_socket(&session);
 		sem_wait(&session.output_thread_terminated);
 		sem_destroy(&session.output_thread_terminated);
@@ -7363,14 +7363,26 @@ void web_server(void* arg)
 				continue;
             }
 
+			union xp_sockaddr local_addr;
+			memset(&local_addr, 0, sizeof(local_addr));
+			socklen_t addr_len = sizeof(local_addr);
+			if(getsockname(client_socket, (struct sockaddr *)&local_addr, &addr_len) != 0) {
+				lprintf(LOG_CRIT,"%04d %s !ERROR %d getting local address/port of socket"
+					,client_socket, session->is_tls ? "HTTPS":"HTTP", ERROR_VALUE);
+				close_socket(&client_socket);
+				continue;
+			}
+			char local_ip[INET6_ADDRSTRLEN];
+			inet_addrtop(&local_addr, local_ip, sizeof local_ip);
+
 			host_port=inet_addrport(&client_addr);
 
 			if (acc_type != NULL && !strcmp(acc_type, "TLS"))
 				session->is_tls=TRUE;
-			lprintf(LOG_INFO,"%04d %s connection accepted from: %s port %u"
+			lprintf(LOG_INFO,"%04d %s [%s] Connection accepted on %s port %u from port %u"
 				,client_socket
 				,session->is_tls ? "HTTPS":"HTTP"
-				,host_ip, host_port);
+				,host_ip, local_ip, inet_addrport(&local_addr), host_port);
 
 			SAFECOPY(session->host_ip,host_ip);
 			memcpy(&session->addr, &client_addr, sizeof(session->addr));