Skip to main content

Config

Struct Config 

Source
pub struct Config {
Show 13 fields pub listen_addr: SocketAddr, pub external_addr: Option<SocketAddr>, pub network: Network, pub initial_mainnet_peers: IndexSet<String>, pub initial_testnet_peers: IndexSet<String>, pub cache_dir: CacheDir, pub identity_dir: PathBuf, pub zakura_node_secret_key: Option<ZakuraNodeSecretKey>, pub p2p_stack: P2pStack, pub zakura: ZakuraConfig, pub peerset_initial_target_size: usize, pub crawl_new_peer_interval: Duration, pub max_connections_per_ip: usize,
}
Expand description

Configuration for networking code.

Fields§

§listen_addr: SocketAddr

The address on which this node should listen for connections.

Can be address:port or just address. If there is no configured port, Zakura will use the default port for the configured network.

address can be an IP address or a DNS name. DNS names are only resolved once, when Zakura starts up.

By default, Zakura listens on [::] (all IPv6 and IPv4 addresses). This enables dual-stack support, accepting both IPv4 and IPv6 connections.

If a specific listener address is configured, Zakura will advertise it to other nodes. But by default, Zakura uses an unspecified address (“[::]:port”), which is not advertised to other nodes.

Zakura does not currently support:

However, other Zakura instances compensate for unspecified or incorrect listener addresses by adding the external IP addresses of peers to their address books.

§external_addr: Option<SocketAddr>

The external address of this node if any.

Zakura binds to listen_addr, but this can be an internal address if the node is behind a firewall, load balancer or NAT. This field can be used to advertise a different address to peers making it possible to receive inbound connections and contribute to the P2P network from behind a firewall, load balancer, or NAT.

§network: Network

The network to connect to.

§initial_mainnet_peers: IndexSet<String>

A list of initial peers for the peerset when operating on mainnet.

§initial_testnet_peers: IndexSet<String>

A list of initial peers for the peerset when operating on testnet.

§cache_dir: CacheDir

An optional root directory for storing cached peer address data.

§Configuration

Set to:

  • true to read and write peer addresses to disk using the default cache path,
  • false to disable reading and writing peer addresses to disk,
  • '/custom/cache/directory' to read and write peer addresses to a custom directory.

By default, all Zakura instances run by the same user will share a single peer cache. If you use a custom cache path, you might also want to change state.cache_dir.

§Functionality

The peer cache is a list of the addresses of some recently useful peers.

For privacy reasons, the cache does not include any other information about peers, such as when they were connected to the node.

Deleting or modifying the peer cache can impact your node’s:

  • reliability: if DNS or the Zcash DNS seeders are unavailable or broken
  • security: if DNS is compromised with malicious peers

If you delete it, Zakura will replace it with a fresh set of peers from the DNS seeders.

§Defaults

The default directory is platform dependent, based on dirs::cache_dir():

PlatformValueExample
Linux$XDG_CACHE_HOME/zakura or $HOME/.cache/zakura/home/alice/.cache/zakura
macOS$HOME/Library/Caches/zakura/Users/Alice/Library/Caches/zakura
Windows{FOLDERID_LocalAppData}\zakuraC:\Users\Alice\AppData\Local\zakura
Otherstd::env::current_dir()/cache/zakura/cache/zakura

§Security

If you are running Zakura with elevated permissions (“root”), create the directory for this file before running Zakura, and make sure the Zakura user account has exclusive access to that directory, and other users can’t modify its parent directories.

§Implementation Details

Each network has a separate peer list, which is updated regularly from the current address book. These lists are stored in network/mainnet.peers and network/testnet.peers files, underneath the cache_dir path.

Previous peer lists are automatically loaded at startup, and used to populate the initial peer set and address book.

§identity_dir: PathBuf

The directory for long-term network identity secrets.

The auto-generated Zakura iroh identity key is stored under this directory as <network>.zakura-iroh-secret-key. Keep this directory outside state or cache snapshot paths, or snapshots can clone the node’s long-term P2P identity.

The default is ~/.zakura.

§zakura_node_secret_key: Option<ZakuraNodeSecretKey>

An optional persistent iroh secret key for Zakura P2P identity.

This is reserved for Zakura endpoint construction. If unset, a future Zakura endpoint implementation will generate an ed25519 iroh SecretKey on first use and persist it under identity_dir, outside Zakura’s cache and state directories by default.

This value is not used by the legacy TCP peer set.

§p2p_stack: P2pStack

The peer-to-peer stack Zakura runs.

zakura.toml valueStack
"default"The configured network’s binary default
"legacy"The legacy TCP Zcash P2P stack only
"zakura"The experimental native Zakura P2P v2 stack only
"dual"Both stacks, enabling experimental v2 with legacy fallback

Leave this at "default" so Zakura can change the per-network default during upgrades. See P2pStack::resolve for the current defaults, and legacy_p2p and v2_p2p for the resolved stack.

§zakura: ZakuraConfig

Native Zakura endpoint, connection, and bootstrap settings.

When v2_p2p is false, these settings are parsed but no iroh endpoint is started. The total intended connection budget is roughly peerset_initial_target_size + zakura.max_connections; tune both together.

§peerset_initial_target_size: usize

The initial target size for the peer set.

Also used to limit the number of inbound and outbound connections made by Zakura, and the size of the cached peer list.

If you have a slow network connection, and Zakura is having trouble syncing, try reducing the peer set size. You can also reduce the peer set size to reduce Zakura’s bandwidth usage.

§crawl_new_peer_interval: Duration

How frequently we attempt to crawl the network to discover new peer addresses.

Zakura asks its connected peers for more peer addresses:

  • regularly, every time crawl_new_peer_interval elapses, and
  • if the peer set is busy, and there aren’t any peer addresses for the next connection attempt.
§max_connections_per_ip: usize

The maximum number of legacy TCP peer connections Zakura will keep for a given IP address before it drops any additional legacy peer connections with that IP.

The default and minimum value are 1.

Zakura uses ZakuraConfig::max_connections_per_ip for native v2 admission.

§Security

Increasing this config above 1 reduces Zakura’s network security.

If this config is greater than 1, Zakura can initiate multiple outbound handshakes to the same IP address.

This config does not currently limit the number of inbound connections that Zakura will accept from the same IP address.

If Zakura makes multiple inbound or outbound connections to the same IP, they will be dropped after the handshake, but before adding them to the peer set. The total numbers of inbound and outbound connections are also limited to a multiple of peerset_initial_target_size.

Implementations§

Source§

impl Config

Source

pub fn peerset_outbound_connection_limit(&self) -> usize

The maximum number of outbound connections that Zakura will open at the same time. When this limit is reached, Zakura stops opening outbound connections.

§Security

See the note at INBOUND_PEER_LIMIT_MULTIPLIER.

§Performance

Zakura’s peer set should be limited to a reasonable size, to avoid queueing too many in-flight block downloads. A large queue of in-flight block downloads can choke a constrained local network connection.

We assume that Zakura nodes have at least 10 Mbps bandwidth. Therefore, a maximum-sized block can take up to 2 seconds to download. So the initial outbound peer set adds up to 100 seconds worth of blocks to the queue. If Zakura has reached its outbound peer limit, that adds an extra 200 seconds of queued blocks.

But the peer set for slow nodes is typically much smaller, due to the handshake RTT timeout. And Zakura responds to inbound request overloads by dropping peer connections.

Source

pub fn peerset_inbound_connection_limit(&self) -> usize

The maximum number of inbound connections that Zakura will accept at the same time. When this limit is reached, Zakura drops new inbound connections, without handshaking on them.

§Security

See the note at INBOUND_PEER_LIMIT_MULTIPLIER.

Source

pub fn peerset_total_connection_limit(&self) -> usize

The maximum number of inbound and outbound connections that Zakura will have at the same time.

Source

pub fn initial_peer_hostnames(&self) -> IndexSet<String>

Returns the initial seed peer hostnames for the configured network.

Source

pub async fn initial_peers(&self) -> HashSet<PeerSocketAddr>

Resolve initial seed peer IP addresses, based on the configured network, and load cached peers from disk, if available.

§Panics

If a configured address is an invalid SocketAddr or DNS name.

Source

pub async fn load_peer_cache(&self) -> Result<HashSet<PeerSocketAddr>>

Returns the addresses in the peer list cache file, if available.

Source

pub async fn update_peer_cache( &self, peer_list: HashSet<PeerSocketAddr>, ) -> Result<()>

Atomically writes a new peer_list to the peer list cache file, if configured. If the list is empty, keeps the previous cache file.

Also creates the peer cache directory, if it doesn’t already exist.

Atomic writes avoid corrupting the cache if Zakura panics or crashes, or if multiple Zakura instances try to read and write the same cache file.

Source

pub fn zakura_secret_key(&self) -> Result<SecretKey, ZakuraSecretKeyError>

Resolves the Zakura native iroh SecretKey for this node, persisting a freshly generated key on first use so the node keeps a stable NodeId across restarts.

Resolution order:

  1. If zakura_node_secret_key is configured, it is parsed and used verbatim. An unparsable value is a hard error.
  2. Otherwise, the persisted key file under identity_dir is loaded; when it is missing or unreadable a fresh key is generated and written atomically with owner-only (0o600) permissions, so every later startup reuses the same identity.
  3. If the key cannot be persisted, the freshly generated identity is used ephemerally for this run.
§Security

The persisted key file is the node’s long-term private identity. It is written outside the cache and state directories and restricted to owner read/write on Unix.

Source

pub fn legacy_p2p(&self) -> bool

Returns true if Zakura should run the legacy TCP Zcash P2P listener, initial peer dialing, and peer crawler on the configured network.

Source

pub fn v2_p2p(&self) -> bool

Returns true if Zakura should run the native Zakura P2P v2 endpoint on the configured network, advertise the P2P v2 service bit during the legacy Zcash handshake, and route mutually capable peers to the Zakura upgrade hook.

Trait Implementations§

Source§

impl Clone for Config

Source§

fn clone(&self) -> Config

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Config

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Config

Source§

fn default() -> Config

Returns the “default value” for a type. Read more
Source§

impl<'de> Deserialize<'de> for Config

Source§

fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Eq for Config

Source§

impl PartialEq for Config

Source§

fn eq(&self, other: &Config) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl Serialize for Config

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl StructuralPartialEq for Config

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> CompatExt for T

Source§

fn compat(self) -> Compat<T>
where T: Sized,

Applies the Compat adapter by value. Read more
Source§

fn compat_ref(&self) -> Compat<&T>

Applies the Compat adapter by shared reference. Read more
Source§

fn compat_mut(&mut self) -> Compat<&mut T>

Applies the Compat adapter by mutable reference. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more