Re: relayd: allow setting log level in relayd.conf (fix relayctl log command)

Kirill A. Korinsky <[email protected]>
Newsgroups gmane.os.openbsd.tech
Message-ID <[email protected]>
On Sat, 01 Aug 2026 14:49:37 +0200,
Rafael Sadowski <[email protected]> wrote:
> 
> "relayctl log verbose|brief" is simply useless and doesn't change a thing.
> We've hidden everything useful for debugging behind DPRINF. You can use
> the diffs to debug relayd again or to get useful information if something
> isn't working in your setup.
> 
> I don't know the history here. Performance? But performance doesn't help me
> when I need to debug my config ;).
> 
> With these diffs, we can also configure it with "log level
> brief|verbose". I'd prefer have info|warn|fatal|debug (like the log
> functions we have). But log.c doesn't support that, and I don't want to
> modify log.c
> 
> Details, see commit msg.
> 
> OK?
>

Make sense and reads OK kirill@

> commit 2f79b1b972e5c80d55562a0381120774463bd669
> Author: Rafael Sadowski <[email protected]>
> Date:   Sat Aug 1 14:06:54 2026 +0200
> 
>     relayd: allow setting log level from relayd.conf
>     
>     Add "log level (brief|verbose)" which sets or clears RELAYD_OPT_VERBOSE
>     just like relayctl log verbose|brief does at runtime.
>     
>     This makes sense now because the recent DPRINTF removal turned all
>     DPRINTF calls into real log_debug calls. Some debug logs moved to
>     warning. Some remained DPRINF().
>     
>     Before that change the toggle had almost nothing to gate. All debug
>     output was compiled out unless relayd was built with DEBUG > 1. So
>     "log verbose" in relayctl was practically a no-op for users.
>     It was impossible for the user to work out why the setup/config wasn't
>     working.
>     
>     Now the toggle actually does what its name suggests. Pinning the
>     level in the config file lets it survive restarts and SIGHUP reloads.
> 
> diff --git a/agentx_control.c b/agentx_control.c
> index 7af1c0e..41bb2d7 100644
> --- a/agentx_control.c
> +++ b/agentx_control.c
> @@ -1003,7 +1003,7 @@ snmp_element(const char *oidstr, enum snmp_type type, void *buf, int64_t val,
>  	u_int64_t		 l;
>  	struct snmp_oid		 oid;
>  
> -	DPRINTF("%s: oid %s type %d buf %p val %lld", __func__,
> +	log_debug("%s: oid %s type %d buf %p val %lld", __func__,
>  	    oidstr, type, buf, val);
>  
>  	if (snmp_string2oid(oidstr, &oid) == -1)
> diff --git a/ca.c b/ca.c
> index f3d3dc0..93dfab6 100644
> --- a/ca.c
> +++ b/ca.c
> @@ -268,7 +268,7 @@ ca_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
>  		if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
>  			fatalx("%s: invalid relay key", __func__);
>  
> -		DPRINTF("%s:%d: key hash %s proc %d",
> +		log_debug("%s:%d: key hash %s proc %d",
>  		    __func__, __LINE__, cko.cko_hash, cko.cko_proc);
>  
>  		if ((to = calloc(1, cko.cko_tlen)) == NULL)
> @@ -508,14 +508,18 @@ rsae_send_imsg(int flen, const u_char *from, u_char *to, RSA *rsa,
>  int
>  rsae_priv_enc(int flen, const u_char *from, u_char *to, RSA *rsa, int padding)
>  {
> -	DPRINTF("%s:%d", __func__, __LINE__);
> +#if DEBUG_CERT
> +	log_debug("%s:%d", __func__, __LINE__);
> +#endif
>  	return rsae_send_imsg(flen, from, to, rsa, padding, IMSG_CA_PRIVENC);
>  }
>  
>  int
>  rsae_priv_dec(int flen, const u_char *from, u_char *to, RSA *rsa, int padding)
>  {
> -	DPRINTF("%s:%d", __func__, __LINE__);
> +#if DEBUG_CERT
> +	log_debug("%s:%d", __func__, __LINE__);
> +#endif
>  	return rsae_send_imsg(flen, from, to, rsa, padding, IMSG_CA_PRIVDEC);
>  }
>  
> @@ -701,7 +705,9 @@ ecdsae_do_sign(const unsigned char *dgst, int dgst_len, const BIGNUM *inv,
>  	ECDSA_SIG *(*psign_sig)(const unsigned char *, int, const BIGNUM *,
>  	    const BIGNUM *, EC_KEY *);
>  
> -	DPRINTF("%s:%d", __func__, __LINE__);
> +#if DEBUG_CERT
> +	log_debug("%s:%d", __func__, __LINE__);
> +#endif
>  	if (EC_KEY_get_ex_data(eckey, 0) != NULL)
>  		return (ecdsae_send_enc_imsg(dgst, dgst_len, inv, rp, eckey));
>  	EC_KEY_METHOD_get_sign(ecdsa_default, NULL, NULL, &psign_sig);
> diff --git a/check_script.c b/check_script.c
> index 07b02b8..4caca71 100644
> --- a/check_script.c
> +++ b/check_script.c
> @@ -106,7 +106,7 @@ script_exec(struct relayd *env, struct ctl_script *scr)
>  		return (-1);
>  	}
>  
> -	DPRINTF("%s: running script %s, host %s",
> +	log_debug("%s: running script %s, host %s",
>  	    __func__, scr->path, scr->name);
>  
>  	arg = scr->name;
> diff --git a/check_tls.c b/check_tls.c
> index f659ba1..3ff55be 100644
> --- a/check_tls.c
> +++ b/check_tls.c
> @@ -206,8 +206,6 @@ check_tls_cleanup(struct ctl_tcp_event *cte)
>  void
>  check_tls_error(struct ctl_tcp_event *cte, const char *where, const char *what)
>  {
> -	if (log_getverbose() < 2)
> -		return;
>  	log_debug("TLS error: %s: %s: %s", where, what, tls_error(cte->tls));
>  }
>  
> diff --git a/config.c b/config.c
> index b273fd7..a6fe546 100644
> --- a/config.c
> +++ b/config.c
> @@ -273,6 +273,8 @@ config_getcfg(struct relayd *env, struct imsg *imsg)
>  		return (-1);
>  	}
>  
> +	log_setverbose((env->sc_conf.opts & RELAYD_OPT_VERBOSE) ? 2 : 0);
> +
>  	what = ps->ps_what[privsep_process];
>  
>  	if (what & CONFIG_TABLES) {
> @@ -316,7 +318,7 @@ config_settable(struct relayd *env, struct table *tb)
>  		if (id == PROC_HCE && tb->conf.check == CHECK_NOCHECK)
>  			continue;
>  
> -		DPRINTF("%s: sending table %s %d to %s", __func__,
> +		log_debug("%s: sending table %s %d to %s", __func__,
>  		    tb->conf.name, tb->conf.id, env->sc_ps->ps_title[id]);
>  
>  		c = 0;
> @@ -379,7 +381,7 @@ config_gettable(struct relayd *env, struct imsg *imsg)
>  
>  	env->sc_tablecount++;
>  
> -	DPRINTF("%s: %s %d received table %d (%s)", __func__,
> +	log_debug("%s: %s %d received table %d (%s)", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    tb->conf.id, tb->conf.name);
>  
> @@ -423,7 +425,7 @@ config_gethost(struct relayd *env, struct imsg *imsg)
>  	TAILQ_INSERT_TAIL(&tb->hosts, host, entry);
>  	TAILQ_INSERT_TAIL(&env->sc_hosts, host, globalentry);
>  
> -	DPRINTF("%s: %s %d received host %s for table %s", __func__,
> +	log_debug("%s: %s %d received host %s for table %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    host->conf.name, tb->conf.name);
>  
> @@ -442,7 +444,7 @@ config_setrdr(struct relayd *env, struct rdr *rdr)
>  		    id == privsep_process)
>  			continue;
>  
> -		DPRINTF("%s: sending rdr %s to %s", __func__,
> +		log_debug("%s: sending rdr %s to %s", __func__,
>  		    rdr->conf.name, ps->ps_title[id]);
>  
>  		proc_compose(ps, id, IMSG_CFG_RDR,
> @@ -487,7 +489,7 @@ config_getrdr(struct relayd *env, struct imsg *imsg)
>  
>  	env->sc_rdrcount++;
>  
> -	DPRINTF("%s: %s %d received rdr %s", __func__,
> +	log_debug("%s: %s %d received rdr %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    rdr->conf.name);
>  
> @@ -517,7 +519,7 @@ config_getvirt(struct relayd *env, struct imsg *imsg)
>  
>  	TAILQ_INSERT_TAIL(&rdr->virts, virt, entry);
>  
> -	DPRINTF("%s: %s %d received address for rdr %s", __func__,
> +	log_debug("%s: %s %d received address for rdr %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    rdr->conf.name);
>  
> @@ -536,7 +538,7 @@ config_setrt(struct relayd *env, struct router *rt)
>  		    id == privsep_process)
>  			continue;
>  
> -		DPRINTF("%s: sending router %s to %s tbl %d", __func__,
> +		log_debug("%s: sending router %s to %s tbl %d", __func__,
>  		    rt->rt_conf.name, ps->ps_title[id], rt->rt_conf.gwtable);
>  
>  		proc_compose(ps, id, IMSG_CFG_ROUTER,
> @@ -576,7 +578,7 @@ config_getrt(struct relayd *env, struct imsg *imsg)
>  
>  	env->sc_routercount++;
>  
> -	DPRINTF("%s: %s %d received router %s", __func__,
> +	log_debug("%s: %s %d received router %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    rt->rt_conf.name);
>  
> @@ -618,7 +620,7 @@ config_getroute(struct relayd *env, struct imsg *imsg)
>  
>  	env->sc_routecount++;
>  
> -	DPRINTF("%s: %s %d received route %d for router %s", __func__,
> +	log_debug("%s: %s %d received route %d for router %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    nr->nr_conf.id, rt->rt_conf.name);
>  
> @@ -638,7 +640,7 @@ config_setproto(struct relayd *env, struct protocol *proto)
>  		    id == privsep_process)
>  			continue;
>  
> -		DPRINTF("%s: sending protocol %s to %s", __func__,
> +		log_debug("%s: sending protocol %s to %s", __func__,
>  		    proto->name, ps->ps_title[id]);
>  
>  		c = 0;
> @@ -670,7 +672,7 @@ config_setrule(struct relayd *env, struct protocol *proto)
>  		    id == privsep_process)
>  			continue;
>  
> -		DPRINTF("%s: sending rules %s to %s", __func__,
> +		log_debug("%s: sending rules %s to %s", __func__,
>  		    proto->name, ps->ps_title[id]);
>  
>  		/* Now send all the rules */
> @@ -746,7 +748,7 @@ config_getproto(struct relayd *env, struct imsg *imsg)
>  
>  	env->sc_protocount++;
>  
> -	DPRINTF("%s: %s %d received protocol %s", __func__,
> +	log_debug("%s: %s %d received protocol %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    proto->name);
>  
> @@ -791,7 +793,7 @@ config_getrule(struct relayd *env, struct imsg *imsg)
>  			free(rule);					\
>  			return (-1);					\
>  		}							\
> -		DPRINTF("%s: %s %s (len %ld, option %d): %s", __func__,	\
> +		log_debug("%s: %s %s (len %ld, option %d): %s", __func__,\
>  		    #_n, #_f, len,					\
>  		    rule->rule_kv[_n].kv_option,			\
>  		    rule->rule_kv[_n].kv_##_f);				\
> @@ -818,7 +820,7 @@ config_getrule(struct relayd *env, struct imsg *imsg)
>  
>  	TAILQ_INSERT_TAIL(&proto->rules, rule, rule_entry);
>  
> -	DPRINTF("%s: %s %d received rule %u for protocol %s", __func__,
> +	log_debug("%s: %s %d received rule %u for protocol %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    rule->rule_id, proto->name);
>  
> @@ -869,7 +871,7 @@ config_setrelay(struct relayd *env, struct relay *rlay)
>  		if ((what & CONFIG_RELAYS) == 0 || id == privsep_process)
>  			continue;
>  
> -		DPRINTF("%s: sending relay %s to %s fd %d", __func__,
> +		log_debug("%s: sending relay %s to %s fd %d", __func__,
>  		    rlay->rl_conf.name, ps->ps_title[id], rlay->rl_s);
>  
>  		memcpy(&rl, &rlay->rl_conf, sizeof(rl));
> @@ -1106,7 +1108,7 @@ config_getrelay(struct relayd *env, struct imsg *imsg)
>  
>  	env->sc_relaycount++;
>  
> -	DPRINTF("%s: %s %d received relay %s", __func__,
> +	log_debug("%s: %s %d received relay %s", __func__,
>  	    ps->ps_title[privsep_process], ps->ps_instance,
>  	    rlay->rl_conf.name);
>  
> @@ -1151,7 +1153,7 @@ config_getrelaytable(struct relayd *env, struct imsg *imsg)
>  
>  	TAILQ_INSERT_TAIL(&rlay->rl_tables, rlt, rlt_entry);
>  
> -	DPRINTF("%s: %s %d received relay table %s for relay %s", __func__,
> +	log_debug("%s: %s %d received relay table %s for relay %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    table->conf.name, rlay->rl_conf.name);
>  
> @@ -1213,7 +1215,7 @@ config_getrelayfd(struct relayd *env, struct imsg *imsg)
>  		break;
>  	}
>  
> -	DPRINTF("%s: %s %d received relay type %d for relay %s", __func__,
> +	log_debug("%s: %s %d received relay type %d for relay %s", __func__,
>  	    env->sc_ps->ps_title[privsep_process], env->sc_ps->ps_instance,
>  	    crfd.type, rlay->rl_conf.name);
>  
> diff --git a/control.c b/control.c
> index fb64608..3ed43bf 100644
> --- a/control.c
> +++ b/control.c
> @@ -265,7 +265,7 @@ control_dispatch_imsg(int fd, short event, void *arg)
>  			break;
>  
>  		if (c->waiting) {
> -			log_debug("%s: unexpected imsg %d",
> +			log_warn("%s: unexpected imsg %d",
>  			    __func__, imsg_get_type(&imsg));
>  			imsg_free(&imsg);
>  			control_close(fd, cs);
> diff --git a/parse.y b/parse.y
> index e89d40e..0c6839d 100644
> --- a/parse.y
> +++ b/parse.y
> @@ -183,7 +183,7 @@ typedef struct {
>  %token	TIMEOUT TLS TO ROUTER RTLABEL TRANSPARENT URL WITH TTL RTABLE
>  %token	MATCH PARAMS RANDOM LEASTSTATES SRCHASH KEY CERTIFICATE PASSWORD ECDHE
>  %token	EDH TICKETS CONNECTION CONNECTIONS CONTEXT ERRORS STATE CHANGES CHECKS
> -%token	WEBSOCKETS PFLOG CLIENT PROXYPROTO V1 V2
> +%token	WEBSOCKETS PFLOG CLIENT PROXYPROTO V1 V2 VERBOSE BRIEF LEVEL
>  %token	<v.string>	STRING
>  %token  <v.number>	NUMBER
>  %type	<v.string>	context hostname interface table value path
> @@ -412,6 +412,12 @@ main		: INTERVAL NUMBER	{
>  		| LOG loglevel		{
>  			conf->sc_conf.opts |= $2;
>  		}
> +		| LOG LEVEL VERBOSE	{
> +			conf->sc_conf.opts |= RELAYD_OPT_VERBOSE;
> +		}
> +		| LOG LEVEL BRIEF	{
> +			conf->sc_conf.opts &= ~RELAYD_OPT_VERBOSE;
> +		}
>  		| TIMEOUT timeout	{
>  			bcopy(&$2, &conf->sc_conf.timeout,
>  			    sizeof(struct timeval));
> @@ -2524,6 +2530,7 @@ lookup(char *s)
>  		{ "backup",		BACKUP },
>  		{ "binary",		BINARY },
>  		{ "block",		BLOCK },
> +		{ "brief",		BRIEF },
>  		{ "buffer",		BUFFER },
>  		{ "ca",			CA },
>  		{ "cache",		CACHE },
> @@ -2566,6 +2573,7 @@ lookup(char *s)
>  		{ "keypair",		KEYPAIR },
>  		{ "label",		LABEL },
>  		{ "least-states",	LEASTSTATES },
> +		{ "level",		LEVEL },
>  		{ "listen",		LISTEN },
>  		{ "loadbalance",	LOADBALANCE },
>  		{ "log",		LOG },
> @@ -2632,6 +2640,7 @@ lookup(char *s)
>  		{ "v1",			V1 },
>  		{ "v2",			V2 },
>  		{ "value",		VALUE },
> +		{ "verbose",		VERBOSE },
>  		{ "websockets",		WEBSOCKETS },
>  		{ "with",		WITH }
>  	};
> diff --git a/pfe.c b/pfe.c
> index c66ad06..1438171 100644
> --- a/pfe.c
> +++ b/pfe.c
> @@ -351,7 +351,7 @@ pfe_dispatch_relay(int fd, struct privsep_proc *p, struct imsg *imsg)
>  			TAILQ_REMOVE(&env->sc_sessions, s, se_entry);
>  			free(s);
>  		} else {
> -			DPRINTF("removal of unpublished session %i", sid);
> +			log_debug("removal of unpublished session %i", sid);
>  		}
>  		break;
>  	default:
> diff --git a/pfe_filter.c b/pfe_filter.c
> index a3587dd..f3dbdae 100644
> --- a/pfe_filter.c
> +++ b/pfe_filter.c
> @@ -414,7 +414,7 @@ sync_ruleset(struct relayd *env, struct rdr *rdr, int enable)
>  		rio.rule.dst.port[1] = address->port.val[1];
>  		rio.rule.rtableid = -1; /* stay in the main routing table */
>  		rio.rule.onrdomain = env->sc_rtable;
> -		DPRINTF("%s rtable %d", __func__, env->sc_rtable);
> +		log_debug("%s rtable %d", __func__, env->sc_rtable);
>  
>  		if (rio.rule.proto == IPPROTO_TCP)
>  			rio.rule.timeout[PFTM_TCP_ESTABLISHED] =
> diff --git a/relay.c b/relay.c
> index 6992900..efc2045 100644
> --- a/relay.c
> +++ b/relay.c
> @@ -724,7 +724,7 @@ relay_connected(int fd, short sig, void *arg)
>  		return;
>  	}
>  
> -	DPRINTF("%s: session %d: successful", __func__, con->se_id);
> +	log_debug("%s: session %d: successful", __func__, con->se_id);
>  
>  	/* Log destination if it was changed in a keep-alive connection */
>  	if ((con->se_table != con->se_table0) &&
> @@ -951,7 +951,7 @@ relay_splice(struct ctl_relay_event *cre)
>  		return (0);
>  
>  	if (!(cre->toread == TOREAD_UNLIMITED || cre->toread > 0)) {
> -		DPRINTF("%s: session %d: splice dir %d, nothing to read %lld",
> +		log_debug("%s: session %d: splice dir %d, nothing to read %lld",
>  		    __func__, con->se_id, cre->dir, cre->toread);
>  		return (0);
>  	}
> @@ -959,7 +959,7 @@ relay_splice(struct ctl_relay_event *cre)
>  	/* do not splice before buffers have not been completely flushed */
>  	if (EVBUFFER_LENGTH(cre->bev->input) ||
>  	    EVBUFFER_LENGTH(cre->dst->bev->output)) {
> -		DPRINTF("%s: session %d: splice dir %d, dirty buffer",
> +		log_debug("%s: session %d: splice dir %d, dirty buffer",
>  		    __func__, con->se_id, cre->dir);
>  		bufferevent_disable(cre->bev, EV_READ);
>  		return (0);
> @@ -977,7 +977,7 @@ relay_splice(struct ctl_relay_event *cre)
>  	cre->splicelen = 0;
>  	bufferevent_enable(cre->bev, EV_READ);
>  
> -	DPRINTF("%s: session %d: splice dir %d, maximum %lld, successful",
> +	log_debug("%s: session %d: splice dir %d, maximum %lld, successful",
>  	    __func__, con->se_id, cre->dir, cre->toread);
>  
>  	return (1);
> @@ -1000,7 +1000,7 @@ relay_splicelen(struct ctl_relay_event *cre)
>  		return (-1);
>  	}
>  
> -	DPRINTF("%s: session %d: splice dir %d, length %lld",
> +	log_debug("%s: session %d: splice dir %d, length %lld",
>  	    __func__, con->se_id, cre->dir, len);
>  
>  	if (len > cre->splicelen) {
> @@ -1034,7 +1034,7 @@ relay_error(struct bufferevent *bev, short error, void *arg)
>  	struct rsession		*con = cre->con;
>  	struct evbuffer		*dst;
>  
> -	DPRINTF("%s: session %d: dir %d state %d to read %lld event error %x",
> +	log_debug("%s: session %d: dir %d state %d to read %lld event error %x",
>  	    __func__, con->se_id, cre->dir, cre->state, cre->toread, error);
>  	if (error & EVBUFFER_TIMEOUT) {
>  		if (cre->splicelen >= 0) {
> @@ -1132,7 +1132,7 @@ relay_accept(int fd, short event, void *arg)
>  
>  			event_del(&rlay->rl_ev);
>  			evtimer_add(&rlay->rl_evt, &evtpause);
> -			log_debug("%s: deferring connections", __func__);
> +			DPRINTF("%s: deferring connections", __func__);
>  		}
>  		return;
>  	}
> @@ -1367,7 +1367,7 @@ relay_from_table(struct rsession *con)
>  
>  			host = rlt->rlt_host[idx];
>  
> -			DPRINTF("%s: session %d: table %s host %s, "
> +			log_debug("%s: session %d: table %s host %s, "
>  			    "p 0x%016llx, idx %d, cnt %d, max %d",
>  			    __func__, con->se_id, table->conf.name,
>  			    host->conf.name, p, idx, cnt, maxtries);
> @@ -1379,20 +1379,20 @@ relay_from_table(struct rsession *con)
>  	} else {
>  		/* handle all non-hashing algorithms */
>  		host = rlt->rlt_host[idx];
> -		DPRINTF("%s: session %d: table %s host %s, p 0x%016llx, idx %d",
> +		log_debug("%s: session %d: table %s host %s, p 0x%016llx, idx %d",
>  		    __func__, con->se_id, table->conf.name, host->conf.name,
>  		    p, idx);
>  	}
>  
>  	while (host != NULL) {
> -		DPRINTF("%s: session %d: host %s", __func__,
> +		log_debug("%s: session %d: host %s", __func__,
>  		    con->se_id, host->conf.name);
>  		if (!table->conf.check || host->up == HOST_UP)
>  			goto found;
>  		host = TAILQ_NEXT(host, entry);
>  	}
>  	TAILQ_FOREACH(host, &table->hosts, entry) {
> -		DPRINTF("%s: session %d: next host %s",
> +		log_debug("%s: session %d: next host %s",
>  		    __func__, con->se_id, host->conf.name);
>  		if (!table->conf.check || host->up == HOST_UP)
>  			goto found;
> @@ -1518,7 +1518,7 @@ void
>  relay_connect_state(struct rsession *con, struct ctl_relay_event *cre,
>      enum relay_state new)
>  {
> -	DPRINTF("%s: session %d: %s state %s -> %s",
> +	log_debug("%s: session %d: %s state %s -> %s",
>  	    __func__, con->se_id,
>  	    cre->dir == RELAY_DIR_REQUEST ? "accept" : "connect",
>  	    relay_state(cre->state), relay_state(new));
> @@ -1538,7 +1538,7 @@ relay_connect_retry(int fd, short sig, void *arg)
>  		relay_inflight = 1;
>  	}
>  
> -	DPRINTF("%s: retry %d of %d, inflight: %d", __func__,
> +	log_debug("%s: retry %d of %d, inflight: %d", __func__,
>  	    con->se_retrycount, con->se_retry, relay_inflight);
>  
>  	if (sig != EV_TIMEOUT)
> @@ -1551,7 +1551,7 @@ relay_connect_retry(int fd, short sig, void *arg)
>  	 * available: client could have closed it while we were waiting?
>  	 */
>  
> -	DPRINTF("%s: got EV_TIMEOUT", __func__);
> +	log_debug("%s: got EV_TIMEOUT", __func__);
>  
>  	if (getdtablecount() + FD_RESERVE +
>  	    relay_inflight > getdtablesize()) {
> @@ -1598,7 +1598,7 @@ relay_connect_retry(int fd, short sig, void *arg)
>  	else
>  		relay_connect_state(con, &con->se_out, STATE_CONNECTED);
>  	relay_inflight--;
> -	DPRINTF("%s: inflight decremented, now %d", __func__, relay_inflight);
> +	log_debug("%s: inflight decremented, now %d", __func__, relay_inflight);
>  
>  	event_add(&rlay->rl_ev, NULL);
>  
> @@ -1724,7 +1724,7 @@ relay_connect(struct rsession *con)
>  
>  	relay_connect_state(con, &con->se_out, STATE_CONNECTED);
>  	relay_inflight--;
> -	DPRINTF("%s: inflight decremented, now %d", __func__,
> +	log_debug("%s: inflight decremented, now %d", __func__,
>  	    relay_inflight);
>  
>  	if (errno == EINPROGRESS)
> @@ -1927,7 +1927,7 @@ relay_dispatch_pfe(int fd, struct privsep_proc *p, struct imsg *imsg)
>  		    NULL)
>  			fatalx("%s: invalid table id", __func__);
>  
> -		DPRINTF("%s: [%d] state %d for "
> +		log_debug("%s: [%d] state %d for "
>  		    "host %u %s", __func__, p->p_ps->ps_instance, st.up,
>  		    host->conf.id, host->conf.name);
>  
> @@ -2445,11 +2445,7 @@ relay_tls_handshake(int fd, short event, void *arg)
>  
>  	ret = tls_handshake(cre->tls);
>  	if (ret == 0) {
> -#ifdef DEBUG
> -		log_info(
> -#else
>  		log_debug(
> -#endif
>  		    "relay %s, tls session %d %s (%d active)",
>  		    rlay->rl_conf.name, con->se_id,
>  		    cre->dir == RELAY_DIR_REQUEST ? "established" : "connected",
> @@ -2498,7 +2494,7 @@ relay_tls_handshake(int fd, short event, void *arg)
>  		return;
>  	}
>  
> -	DPRINTF("%s: session %d: scheduling on %s", __func__, con->se_id,
> +	log_debug("%s: session %d: scheduling on %s", __func__, con->se_id,
>  	    (retry_flag == EV_READ) ? "EV_READ" : "EV_WRITE");
>  	event_again(&con->se_ev, fd, EV_TIMEOUT|retry_flag, relay_tls_handshake,
>  	    &con->se_tv_start, &rlay->rl_conf.timeout, cre);
> diff --git a/relay_http.c b/relay_http.c
> index dbaafa7..e3a668f 100644
> --- a/relay_http.c
> +++ b/relay_http.c
> @@ -123,8 +123,7 @@ relay_http_priv_init(struct rsession *con)
>  	if ((hs = calloc(1, sizeof(*hs))) == NULL)
>  		return (-1);
>  	SIMPLEQ_INIT(&hs->hs_methods);
> -	DPRINTF("%s: session %d http_session %p", __func__,
> -	    con->se_id, hs);
> +	log_debug("%s: session %d http_session %p", __func__, con->se_id, hs);
>  	con->se_priv = hs;
>  	return (relay_httpdesc_init(&con->se_in));
>  }
> @@ -203,7 +202,7 @@ relay_read_http(struct bufferevent *bev, void *arg)
>  	cre->timedout = 0;
>  
>  	size = EVBUFFER_LENGTH(src);
> -	DPRINTF("%s: session %d: size %lu, to read %lld",
> +	log_debug("%s: session %d: size %lu, to read %lld",
>  	    __func__, con->se_id, size, cre->toread);
>  	if (size == 0) {
>  		if (cre->dir == RELAY_DIR_RESPONSE)
> @@ -280,7 +279,7 @@ relay_read_http(struct bufferevent *bev, void *arg)
>  			key = desc->http_lastheader->kv_key;
>  			value = desc->http_lastheader->kv_value;
>  
> -			DPRINTF("%s: session %d: header '%s: %s'", __func__,
> +			log_debug("%s: session %d: header '%s: %s'", __func__,
>  			    con->se_id, key, value);
>  
>  			if (desc->http_method != HTTP_METHOD_NONE &&
> @@ -644,7 +643,7 @@ relay_read_httpcontent(struct bufferevent *bev, void *arg)
>  	cre->timedout = 0;
>  
>  	size = EVBUFFER_LENGTH(src);
> -	DPRINTF("%s: session %d: size %lu, to read %lld", __func__,
> +	log_debug("%s: session %d: size %lu, to read %lld", __func__,
>  	    con->se_id, size, cre->toread);
>  	if (!size)
>  		return;
> @@ -664,7 +663,7 @@ relay_read_httpcontent(struct bufferevent *bev, void *arg)
>  				goto fail;
>  			cre->toread -= size;
>  		}
> -		DPRINTF("%s: done, size %lu, to read %lld", __func__,
> +		log_debug("%s: done, size %lu, to read %lld", __func__,
>  		    size, cre->toread);
>  	}
>  	if (cre->toread == 0) {
> @@ -705,7 +704,7 @@ relay_read_httpchunks(struct bufferevent *bev, void *arg)
>  	cre->timedout = 0;
>  
>  	size = EVBUFFER_LENGTH(src);
> -	DPRINTF("%s: session %d: size %lu, to read %lld", __func__,
> +	log_debug("%s: session %d: size %lu, to read %lld", __func__,
>  	    con->se_id, size, cre->toread);
>  	if (!size)
>  		return;
> @@ -725,7 +724,7 @@ relay_read_httpchunks(struct bufferevent *bev, void *arg)
>  				goto fail;
>  			cre->toread -= size;
>  		}
> -		DPRINTF("%s: done, size %lu, to read %lld", __func__,
> +		log_debug("%s: done, size %lu, to read %lld", __func__,
>  		    size, cre->toread);
>  	}
>  	switch (cre->toread) {
> @@ -768,7 +767,7 @@ relay_read_httpchunks(struct bufferevent *bev, void *arg)
>  		free(line);
>  
>  		if ((cre->toread = llval) == 0) {
> -			DPRINTF("%s: last chunk", __func__);
> +			log_debug("%s: last chunk", __func__);
>  			cre->toread = TOREAD_HTTP_CHUNK_TRAILER;
>  		}
>  		break;
> @@ -870,7 +869,7 @@ _relay_lookup_url(struct ctl_relay_event *cre, char *host, char *path,
>  		break;
>  	}
>  
> -	DPRINTF("%s: session %d: %s, %s: %d", __func__, con->se_id,
> +	log_debug("%s: session %d: %s, %s: %d", __func__, con->se_id,
>  	    str, kv->kv_key, strcasecmp(kv->kv_key, str));
>  
>  	if (strcasecmp(kv->kv_key, str) == 0) {
> @@ -903,7 +902,7 @@ relay_lookup_url(struct ctl_relay_event *cre, const char *host, struct kv *kv)
>  	 *     developers_guide.html#PerformingLookups
>  	 */
>  
> -	DPRINTF("%s: host '%s', path '%s', query '%s'",
> +	log_debug("%s: host '%s', path '%s', query '%s'",
>  	    __func__, host, desc->http_path,
>  	    desc->http_query == NULL ? "" : desc->http_query);
>  
> @@ -995,7 +994,7 @@ relay_lookup_cookie(struct ctl_relay_event *cre, const char *str,
>  		if (value[strlen(value) - 1] == '"')
>  			value[strlen(value) - 1] = '\0';
>  
> -		DPRINTF("%s: key %s = %s, %s = %s : %d",
> +		log_debug("%s: key %s = %s, %s = %s : %d",
>  		    __func__, key, value, kv->kv_key, kv->kv_value,
>  		    strcasecmp(kv->kv_key, key));
>  
> @@ -1178,13 +1177,13 @@ relay_close_http(struct rsession *con)
>  	struct http_session	*hs = con->se_priv;
>  	struct http_method_node	*hmn;
>  
> -	DPRINTF("%s: session %d http_session %p", __func__,
> +	log_debug("%s: session %d http_session %p", __func__,
>  	    con->se_id, hs);
>  	if (hs != NULL)
>  		while (!SIMPLEQ_EMPTY(&hs->hs_methods)) {
>  			hmn = SIMPLEQ_FIRST(&hs->hs_methods);
>  			SIMPLEQ_REMOVE_HEAD(&hs->hs_methods, hmn_entry);
> -			DPRINTF("%s: session %d freeing %s", __func__,
> +			log_debug("%s: session %d freeing %s", __func__,
>  			    con->se_id, relay_httpmethod_byid(hmn->hmn_method));
>  			free(hmn);
>  		}
> @@ -1298,7 +1297,7 @@ relay_writeresponse_http(struct ctl_relay_event *dst,
>  {
>  	struct http_descriptor	*desc = (struct http_descriptor *)cre->desc;
>  
> -	DPRINTF("version: %s rescode: %s resmsg: %s", desc->http_version,
> +	log_debug("version: %s rescode: %s resmsg: %s", desc->http_version,
>  	    desc->http_rescode, desc->http_resmesg);
>  
>  	if (relay_bufferevent_print(dst, desc->http_version) == -1 ||
> @@ -1852,12 +1851,12 @@ relay_apply_actions(struct ctl_relay_event *cre, struct kvlist *actions,
>  #define	RELAY_GET_SKIP_STEP(i)						\
>  	do {								\
>  		r = r->rule_skip[i];					\
> -		DPRINTF("%s:%d: skip %d rules", __func__, __LINE__, i);	\
> +		log_debug("%s:%d: skip %d rules", __func__, __LINE__, i);\
>  	} while (0)
>  
>  #define	RELAY_GET_NEXT_STEP						\
>  	do {								\
> -		DPRINTF("%s:%d: next rule", __func__, __LINE__);	\
> +		log_debug("%s:%d: next rule", __func__, __LINE__);	\
>  		goto nextrule;						\
>  	} while (0)
>  
> @@ -1909,7 +1908,7 @@ relay_test(struct protocol *proto, struct ctl_relay_event *cre)
>  		else if ((res = relay_httpcookie_test(cre, r, &matches)) != 0)
>  			RELAY_GET_NEXT_STEP;
>  		else {
> -			DPRINTF("%s: session %d: matched rule %d",
> +			log_debug("%s: session %d: matched rule %d",
>  			    __func__, con->se_id, r->rule_id);
>  
>  			if (r->rule_action == RULE_ACTION_MATCH) {
> @@ -1939,7 +1938,7 @@ relay_test(struct protocol *proto, struct ctl_relay_event *cre)
>  
>   nextrule:
>  			/* Continue to find last matching policy */
> -			DPRINTF("%s: session %d, res %d", __func__,
> +			log_debug("%s: session %d, res %d", __func__,
>  			    con->se_id, res);
>  			if (res == RES_BAD || res == RES_INTERNAL)
>  				return (res);
> @@ -1959,7 +1958,7 @@ relay_test(struct protocol *proto, struct ctl_relay_event *cre)
>  		action = RES_DROP;
>  	}
>  
> -	DPRINTF("%s: session %d: action %d", __func__,
> +	log_debug("%s: session %d: action %d", __func__,
>  	    con->se_id, action);
>  
>  	return (action);
> @@ -2045,7 +2044,7 @@ relay_http_parse_startline(struct ctl_relay_event *cre, char *line,
>  	char			*key, *value;
>  	const char		*errstr;
>  
> -	DPRINTF("%s: session %d http_session %p", __func__, con->se_id, hs);
> +	log_debug("%s: session %d http_session %p", __func__, con->se_id, hs);
>  
>  	key = line;
>  	if ((value = strchr(key, ' ')) == NULL) {
> @@ -2064,12 +2063,12 @@ relay_http_parse_startline(struct ctl_relay_event *cre, char *line,
>  		 */
>  		if (hmn == NULL) {
>  			*request_method = HTTP_METHOD_NONE;
> -			DPRINTF("%s: session %d unbalanced response",
> +			log_debug("%s: session %d unbalanced response",
>  			    __func__, con->se_id);
>  		} else {
>  			SIMPLEQ_REMOVE_HEAD(&hs->hs_methods, hmn_entry);
>  			*request_method = hmn->hmn_method;
> -			DPRINTF("%s: session %d dequeuing %s",
> +			log_debug("%s: session %d dequeuing %s",
>  			    __func__, con->se_id,
>  			    relay_httpmethod_byid(*request_method));
>  			free(hmn);
> @@ -2098,13 +2097,13 @@ relay_http_parse_startline(struct ctl_relay_event *cre, char *line,
>  		desc->http_status = strtonum(desc->http_rescode, 100, 599,
>  		    &errstr);
>  		if (errstr) {
> -			DPRINTF(
> +			log_debug(
>  			    "%s: http_status %s: errno %d, %s",
>  			    __func__, desc->http_rescode, errno,
>  			    errstr);
>  			goto fail;
>  		}
> -		DPRINTF("http_version %s http_rescode %s http_resmesg %s",
> +		log_debug("http_version %s http_rescode %s http_resmesg %s",
>  		    desc->http_version, desc->http_rescode,
>  		    desc->http_resmesg);
>  	} else if (cre->dir == RELAY_DIR_REQUEST) {
> @@ -2116,7 +2115,7 @@ relay_http_parse_startline(struct ctl_relay_event *cre, char *line,
>  		if ((hmn = calloc(1, sizeof *hmn)) == NULL)
>  			goto fail;
>  		hmn->hmn_method = desc->http_method;
> -		DPRINTF("%s: session %d enqueuing %s", __func__, con->se_id,
> +		log_debug("%s: session %d enqueuing %s", __func__, con->se_id,
>  		    relay_httpmethod_byid(hmn->hmn_method));
>  		SIMPLEQ_INSERT_TAIL(&hs->hs_methods, hmn, hmn_entry);
>  		/*
> diff --git a/relay_udp.c b/relay_udp.c
> index 7226861..27ec18b 100644
> --- a/relay_udp.c
> +++ b/relay_udp.c
> @@ -491,13 +491,13 @@ relay_dns_request(struct rsession *con)
>  	    (struct sockaddr *)&con->se_out.ss, slen) == -1) {
>  		if (con->se_retry) {
>  			con->se_retry--;
> -			log_debug("%s: session %d: "
> +			log_warn("%s: session %d: "
>  			    "forward failed: %s, %s", __func__,
>  			    con->se_id, strerror(errno),
>  			    con->se_retry ? "next retry" : "last retry");
>  			goto retry;
>  		}
> -		log_debug("%s: session %d: forward failed: %s", __func__,
> +		log_warn("%s: session %d: forward failed: %s", __func__,
>  		    con->se_id, strerror(errno));
>  		return (-1);
>  	}
> diff --git a/relayd.c b/relayd.c
> index 7043735..34ae0d0 100644
> --- a/relayd.c
> +++ b/relayd.c
> @@ -70,6 +70,8 @@ void		 parent_tls_ticket_rekey(int, short, void *);
>  
>  struct relayd			*relayd_env;
>  
> +static int			 cli_verbose;
> +
>  static struct privsep_proc procs[] = {
>  	{ "pfe",	PROC_PFE, parent_dispatch_pfe, pfe },
>  	{ "hce",	PROC_HCE, parent_dispatch_hce, hce },
> @@ -121,7 +123,7 @@ int
>  main(int argc, char *argv[])
>  {
>  	int			 c;
> -	int			 debug = 0, verbose = 0;
> +	int			 debug = 0;
>  	u_int32_t		 opts = 0;
>  	struct relayd		*env;
>  	struct privsep		*ps;
> @@ -149,7 +151,7 @@ main(int argc, char *argv[])
>  			conffile = optarg;
>  			break;
>  		case 'v':
> -			verbose++;
> +			cli_verbose = 1;
>  			opts |= RELAYD_OPT_VERBOSE;
>  			break;
>  		case 'P':
> @@ -197,6 +199,10 @@ main(int argc, char *argv[])
>  	if (debug)
>  		env->sc_conf.opts |= RELAYD_OPT_LOGUPDATE;
>  
> +	/* CLI always wins over log level form config. */
> +	if (cli_verbose)
> +		env->sc_conf.opts |= RELAYD_OPT_VERBOSE;
> +
>  	if (geteuid())
>  		errx(1, "need root privileges");
>  
> @@ -204,7 +210,7 @@ main(int argc, char *argv[])
>  		errx(1, "unknown user %s", RELAYD_USER);
>  
>  	log_init(debug, LOG_DAEMON);
> -	log_setverbose(verbose);
> +	log_setverbose(env->sc_conf.opts & RELAYD_OPT_VERBOSE ? 2 : 0);
>  
>  	if (env->sc_conf.opts & RELAYD_OPT_NOACTION)
>  		ps->ps_noaction = 1;
> @@ -311,6 +317,10 @@ parent_configure(struct relayd *env)
>  	/* HCE, PFE, CA and the relays need to reload their config. */
>  	env->sc_reload = 2 + (2 * env->sc_conf.prefork_relay);
>  
> +	/* CLI always wins over log level form config. */
> +	if (cli_verbose)
> +		env->sc_conf.opts |= RELAYD_OPT_VERBOSE;
> +
>  	for (id = 0; id < PROC_MAX; id++) {
>  		if (id == privsep_process)
>  			continue;
> @@ -343,14 +353,14 @@ parent_reload(struct relayd *env, u_int reset, const char *filename)
>  
>  	if (reset == CONFIG_RELOAD) {
>  		if (load_config(filename, env) == -1) {
> -			log_debug("%s: failed to load config file %s",
> +			log_warn("%s: failed to load config file %s",
>  			    __func__, filename);
>  		}
>  
>  		config_setreset(env, CONFIG_ALL);
>  
>  		if (parent_configure(env) == -1) {
> -			log_debug("%s: failed to commit config from %s",
> +			log_warn("%s: failed to commit config from %s",
>  			    __func__, filename);
>  		}
>  	} else
> @@ -878,10 +888,8 @@ kv_find_value(struct kvtree *keys, char *key, const char *value,
>  	/* not matched */
>  	match = NULL;
>   done:
> -#ifdef DEBUG
>  	if (match != NULL)
> -		DPRINTF("%s: matched %s: %s", __func__, key, value);
> -#endif
> +		log_debug("%s: matched %s: %s", __func__, key, value);
>  	free(val);
>  	return (match);
>  }
> @@ -1516,7 +1524,6 @@ expand_string(char *label, size_t len, const char *srch, const char *repl)
>  	char *p, *q;
>  
>  	if ((tmp = calloc(1, len)) == NULL) {
> -		log_debug("%s: calloc", __func__);
>  		return (-1);
>  	}
>  	p = label;
> @@ -1524,7 +1531,7 @@ expand_string(char *label, size_t len, const char *srch, const char *repl)
>  		*q = '\0';
>  		if ((strlcat(tmp, p, len) >= len) ||
>  		    (strlcat(tmp, repl, len) >= len)) {
> -			log_debug("%s: string too long", __func__);
> +			log_warn("%s: string too long", __func__);
>  			free(tmp);
>  			return (-1);
>  		}
> @@ -1532,7 +1539,7 @@ expand_string(char *label, size_t len, const char *srch, const char *repl)
>  		p = q;
>  	}
>  	if (strlcat(tmp, p, len) >= len) {
> -		log_debug("%s: string too long", __func__);
> +		log_warn("%s: string too long", __func__);
>  		free(tmp);
>  		return (-1);
>  	}
> @@ -1669,7 +1676,7 @@ parse_url(const char *url, char **protoptr, char **hostptr, char **pathptr)
>  	/* strip path after host */
>  	host[strcspn(host, "/")] = '\0';
>  
> -	DPRINTF("%s: %s proto %s, host %s, path %s", __func__,
> +	log_debug("%s: %s proto %s, host %s, path %s", __func__,
>  	    url, proto, host, path);
>  
>  	*protoptr = proto;
> @@ -1913,7 +1920,8 @@ accept_reserve(int sockfd, struct sockaddr *addr, socklen_t *addrlen,
>  
>  	if ((ret = accept4(sockfd, addr, addrlen, SOCK_NONBLOCK)) > -1) {
>  		(*counter)++;
> -		DPRINTF("%s: inflight incremented, now %d", __func__, *counter);
> +		log_debug("%s: inflight incremented, now %d", __func__,
> +		    *counter);
>  	}
>  	return (ret);
>  }
> @@ -1926,7 +1934,7 @@ parent_tls_ticket_rekey(int fd, short events, void *arg)
>  	struct timeval		 tv;
>  	struct relay_ticket_key	 key;
>  
> -	log_debug("%s: rekeying tickets", __func__);
> +	DPRINTF("%s: rekeying tickets", __func__);
>  
>  	key.tt_keyrev = arc4random();
>  	arc4random_buf(key.tt_key, sizeof(key.tt_key));
> diff --git a/relayd.conf.5 b/relayd.conf.5
> index 4c48620..5cb3c5f 100644
> --- a/relayd.conf.5
> +++ b/relayd.conf.5
> @@ -165,6 +165,18 @@ or
>  When using relays, log all TCP connections.
>  Optionally log only
>  .Ic connection errors .
> +.It Xo
> +.Ic log level
> +.Pq Ic brief Ns | Ns Ic verbose
> +.Xc
> +Set the log verbosity.
> +.Ic brief
> +is the default;
> +.Ic verbose
> +enables debug logging, equivalent to starting
> +.Xr relayd 8
> +with
> +.Fl v .
>  .It Ic prefork Ar number
>  When using relays, run the specified number of processes to handle
>  relayed connections.
> diff --git a/relayd.h b/relayd.h
> index 2aa6eab..4cfd547 100644
> --- a/relayd.h
> +++ b/relayd.h
> @@ -1159,9 +1159,7 @@ int	 cmdline_symset(char *);
>  const char *host_error(enum host_error);
>  const char *host_status(enum host_status);
>  const char *table_check(enum table_check);
> -#ifdef DEBUG
>  const char *relay_state(enum relay_state);
> -#endif
>  const char	*print_availability(u_long, u_long);
>  const char	*print_host(struct sockaddr_storage *, char *, size_t);
>  const char	*print_time(struct timeval *, struct timeval *, char *, size_t);
> diff --git a/util.c b/util.c
> index 527891f..472b99f 100644
> --- a/util.c
> +++ b/util.c
> @@ -179,7 +179,6 @@ table_check(enum table_check check)
>  	return ("invalid");
>  }
>  
> -#ifdef DEBUG
>  const char *
>  relay_state(enum relay_state state)
>  {
> @@ -200,7 +199,6 @@ relay_state(enum relay_state state)
>  	/* NOTREACHED */
>  	return ("invalid");
>  }
> -#endif
>  
>  const char *
>  print_availability(u_long cnt, u_long up)
> 

-- 
wbr, Kirill
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.