func()

in glog_logger.go [32:108]


func (l glogLogger) Log(msg dhcplb.LogMessage) error {
	sample := map[string]interface{}{
		"version":      msg.Version,
		"dhcp_server":  msg.Server,
		"server_is_rc": msg.ServerIsRC,
		"source_ip":    msg.Peer.IP.String(),
		"success":      msg.Success,
		"latency_us":   msg.Latency.Nanoseconds() / 1000,
	}
	if msg.ErrorName != "" {
		sample["error_name"] = msg.ErrorName
		sample["error_details"] = fmt.Sprintf("%s", msg.ErrorDetails)
	}

	if msg.Packet != nil {
		if msg.Version == 4 {
			packet, err := dhcpv4.FromBytes(msg.Packet)
			if err != nil {
				glog.Errorf("Error decoding DHCPv4 packet: %s", err)
				return err
			}
			sample["type"] = packet.MessageType().String()
			sample["xid"] = packet.TransactionID.String()
			sample["giaddr"] = packet.GatewayIPAddr.String()
			sample["client_mac"] = packet.ClientHWAddr.String()
		} else if msg.Version == 6 {
			packet, err := dhcpv6.FromBytes(msg.Packet)
			if err != nil {
				glog.Errorf("Error decoding DHCPv6 packet: %s", err)
				return err
			}
			sample["type"] = packet.Type().String()
			msg, err := packet.GetInnerMessage()
			if err != nil {
				glog.Errorf("Failed to get inner packet: %s", err)
				return err
			}
			sample["xid"] = msg.TransactionID.String()
			if duid := msg.Options.ClientID(); duid != nil {
				sample["duid"] = net.HardwareAddr(duid.ToBytes()).String()
				sample["duid_type"] = duid.Type.String()
			}
			if mac, err := dhcpv6.ExtractMAC(packet); err != nil {
				glog.Errorf("error getting mac: %s", err)
			} else {
				sample["client_mac"] = mac.String()
			}
			if packet.IsRelay() {
				relay := packet.(*dhcpv6.RelayMessage)
				sample["link-addr"] = relay.LinkAddr.String()
				sample["peer-addr"] = relay.PeerAddr.String()
			}
		}
	}

	// Order samples by key, store them into logline slice
	keys := make([]string, len(sample))
	i := 0
	for key, _ := range sample {
		keys[i] = key
		i++
	}
	sort.Strings(keys)
	logline := make([]string, len(sample))
	i = 0
	for k := range keys {
		logline[i] = fmt.Sprintf("%s: %+v", keys[k], sample[keys[k]])
		i++
	}

	if msg.Success {
		glog.Infof("%s", strings.Join(logline, ", "))
	} else {
		glog.Errorf("%s", strings.Join(logline, ", "))
	}
	return nil
}