package canonicallog

import (
	
	
	
	

	

	logging 
	
	manet 
)

var log = logging.WithSkip(logging.Logger("canonical-log"), 1)

// LogMisbehavingPeer is the canonical way to log a misbehaving peer.
// Protocols should use this to identify a misbehaving peer to allow the end
// user to easily identify these nodes across protocols and libp2p.
func ( peer.ID,  multiaddr.Multiaddr,  string,  error,  string) {
	log.Warnf("CANONICAL_MISBEHAVING_PEER: peer=%s addr=%s component=%s err=%q msg=%q", , .String(), , , )
}

// LogMisbehavingPeerNetAddr is the canonical way to log a misbehaving peer.
// Protocols should use this to identify a misbehaving peer to allow the end
// user to easily identify these nodes across protocols and libp2p.
func ( peer.ID,  net.Addr,  string,  error,  string) {
	,  := manet.FromNetAddr()
	if  != nil {
		log.Warnf("CANONICAL_MISBEHAVING_PEER: peer=%s net_addr=%s component=%s err=%q msg=%q", , .String(), , , )
		return
	}

	LogMisbehavingPeer(, , , , )
}

// LogPeerStatus logs any useful information about a peer. It takes in a sample
// rate and will only log one in every sampleRate messages (randomly). This is
// useful in surfacing events that are normal in isolation, but may be abnormal
// in large quantities. For example, a successful connection from an IP address
// is normal. 10,000 connections from that same IP address is not normal. libp2p
// itself does nothing besides emitting this log. Hook this up to another tool
// like fail2ban to action on the log.
func ( int,  peer.ID,  multiaddr.Multiaddr,  ...string) {
	if rand.Intn() == 0 {
		 := strings.Builder{}
		for ,  := range  {
			if %2 == 0 {
				fmt.Fprintf(&, " %v=", )
			} else {
				fmt.Fprintf(&, "%q", )
			}
		}
		log.Infof("CANONICAL_PEER_STATUS: peer=%s addr=%s sample_rate=%v%s", , .String(), , .String())
	}
}