diff --git a/obfs4proxy/obfs4proxy.go b/obfs4proxy/obfs4proxy.go
index 882012746a9945b90c9f029daffa2f3762ad5f17..7ba0e93951ff5a4df99f5783fdc73e7c48ae9e19 100644
--- a/obfs4proxy/obfs4proxy.go
+++ b/obfs4proxy/obfs4proxy.go
@@ -167,7 +167,11 @@ func clientHandler(f base.ClientFactory, conn *pt.SocksConn, proxyURI *url.URL)
 		// the configuration phase.
 		dialer, err := proxy.FromURL(proxyURI, proxy.Direct)
 		if err != nil {
-			log.Printf("[ERROR]: %s(%s) - failed to obtain proxy dialer: %s", name, addrStr, err)
+			if unsafeLogging {
+				log.Printf("[ERROR]: %s(%s) - failed to obtain proxy dialer: %s", name, addrStr, err)
+			} else {
+				log.Printf("[ERROR]: %s(%s) - failed to obtain proxy dialer", name, addrStr)
+			}
 			conn.Reject()
 			return
 		}
@@ -191,18 +195,26 @@ func clientHandler(f base.ClientFactory, conn *pt.SocksConn, proxyURI *url.URL)
 	// bytes back and forth.
 	remote, err := f.WrapConn(remoteConn, args)
 	if err != nil {
-		log.Printf("[ERROR]: %s(%s) - handshake failed: %s", name, addrStr, err)
+		if unsafeLogging {
+			log.Printf("[ERROR]: %s(%s) - handshake failed: %s", name, addrStr, err)
+		} else {
+			log.Printf("[ERROR]: %s(%s) - handshake failed", name, addrStr)
+		}
 		conn.Reject()
 		return
 	}
 	err = conn.Grant(remoteConn.RemoteAddr().(*net.TCPAddr))
 	if err != nil {
-		log.Printf("[ERROR]: %s(%s) - SOCKS grant failed: %s", name, addrStr, err)
+		if unsafeLogging {
+			log.Printf("[ERROR]: %s(%s) - SOCKS grant failed: %s", name, addrStr, err)
+		} else {
+			log.Printf("[ERROR]: %s(%s) - SOCKS grant failed", name, addrStr)
+		}
 		return
 	}
 
 	err = copyLoop(conn, remote)
-	if err != nil {
+	if err != nil && unsafeLogging {
 		log.Printf("[INFO]: %s(%s) - closed connection: %s", name, addrStr, err)
 	} else {
 		log.Printf("[INFO]: %s(%s) - closed connection", name, addrStr)
@@ -282,20 +294,28 @@ func serverHandler(f base.ServerFactory, conn net.Conn, info *pt.ServerInfo) {
 	// Instantiate the server transport method and handshake.
 	remote, err := f.WrapConn(conn)
 	if err != nil {
-		log.Printf("[ERROR]: %s(%s) - handshake failed: %s", name, addrStr, err)
+		if unsafeLogging {
+			log.Printf("[ERROR]: %s(%s) - handshake failed: %s", name, addrStr, err)
+		} else {
+			log.Printf("[ERROR]: %s(%s) - handshake failed", name, addrStr)
+		}
 		return
 	}
 
 	// Connect to the orport.
 	orConn, err := pt.DialOr(info, conn.RemoteAddr().String(), name)
 	if err != nil {
-		log.Printf("[ERROR]: %s(%s) - failed to connect to ORPort: %s", name, addrStr, err)
+		if unsafeLogging {
+			log.Printf("[ERROR]: %s(%s) - failed to connect to ORPort: %s", name, addrStr, err)
+		} else {
+			log.Printf("[ERROR]: %s(%s) - failed to connect to ORPort", name, addrStr)
+		}
 		return
 	}
 	defer orConn.Close()
 
 	err = copyLoop(orConn, remote)
-	if err != nil {
+	if err != nil && unsafeLogging {
 		log.Printf("[INFO]: %s(%s) - closed connection: %s", name, addrStr, err)
 	} else {
 		log.Printf("[INFO]: %s(%s) - closed connection", name, addrStr)