Skip to main content

LogPolicy

Struct LogPolicy 

Source
pub struct LogPolicy {
    pub full_paths: bool,
    pub sensitivity: Sensitivity,
    pub paths: PathAliases,
    /* private fields */
}
Expand description

Filters events before formatting and sanitizes values before ordinary sinks.

Fields§

§full_paths: bool

Enables full typed-path output only by explicit configuration.

§sensitivity: Sensitivity

Safe, Diagnostic or explicit encrypted Sensitive output.

§paths: PathAliases

Trusted aliases for typed local path fields.

Implementations§

Source§

impl LogPolicy

Source

pub fn new(verbosity: Verbosity) -> Self

Creates a safe policy with one global verbosity threshold.

Examples found in repository?
examples/verbosity.rs (line 20)
18fn main() {
19    // V4 remains the default for application-wide operational messages.
20    let mut policy = LogPolicy::new(Verbosity::V4);
21
22    // Only synchronization is allowed to emit V5 through V9 details.
23    policy.set_component("sync", Verbosity::V9);
24}
More examples
Hide additional examples
examples/component_filter.rs (line 21)
19fn main() {
20    // All components start at V4, keeping normal output concise.
21    let mut policy = LogPolicy::new(Verbosity::V4);
22
23    // Synchronization may need temporary I/O and timing diagnostics.
24    policy.set_component("sync", Verbosity::V8);
25
26    let log = LogDispatcher::new(policy, vec![Arc::new(ConsoleSink::new())]);
27
28    let event = log.event(0, "sync");
29
30    // This V7 event is selected only because the sync override allows it.
31    event.verbosity(7).debug("batch details");
32}
examples/file_logging.rs (line 32)
22fn main() -> Result<(), appcore_log::LogConfigError> {
23    // Keep generated output predictable and inside Cargo's ignored target tree.
24    let output_directory = PathBuf::from("target/appcore-log-example");
25    std::fs::create_dir_all(&output_directory).map_err(|_| LogConfigError::Sink(LogError::Io))?;
26
27    let active_file = output_directory.join("application.jsonl");
28
29    // Two rotations stay beside the active file. Older rotations move into
30    // archive/YYYY/MM and the complete archive never exceeds 120 files.
31    let archive_directory = output_directory.join("archive");
32    let mut policy = LogPolicy::new(Verbosity::V4);
33    policy.set_component("sync", Verbosity::V8);
34
35    let logger = LoggerConfig {
36        policy,
37        output: LogOutputMode::TerminalAndFile,
38        file: Some(FileSinkConfig {
39            path: active_file,
40            max_bytes: LOG_SIZE_8_MIB,
41            sync_each_write: false,
42            retention: 2,
43            archive: Some(FileArchiveConfig {
44                directory: archive_directory,
45                max_files: 120,
46            }),
47        }),
48        ..LoggerConfig::default()
49    }
50    .build()?;
51
52    let application = logger.dispatcher().event(0, "application");
53    let sync = logger.dispatcher().event(1, "sync.transport");
54
55    application.info("application ready; inspect target/appcore-log-example/application.jsonl");
56
57    // The parent component policy makes this V7 diagnostic visible.
58    sync.verbosity(7).debug("replication batch sent");
59
60    sync.warn("peer response was delayed");
61
62    let stats = logger.dispatcher().stats();
63    assert_eq!(stats.sink_failures, 0);
64
65    Ok(())
66}
Source

pub fn set_component( &mut self, component: impl Into<String>, verbosity: Verbosity, )

Overrides a component threshold without changing the global threshold.

Examples found in repository?
examples/verbosity.rs (line 23)
18fn main() {
19    // V4 remains the default for application-wide operational messages.
20    let mut policy = LogPolicy::new(Verbosity::V4);
21
22    // Only synchronization is allowed to emit V5 through V9 details.
23    policy.set_component("sync", Verbosity::V9);
24}
More examples
Hide additional examples
examples/component_filter.rs (line 24)
19fn main() {
20    // All components start at V4, keeping normal output concise.
21    let mut policy = LogPolicy::new(Verbosity::V4);
22
23    // Synchronization may need temporary I/O and timing diagnostics.
24    policy.set_component("sync", Verbosity::V8);
25
26    let log = LogDispatcher::new(policy, vec![Arc::new(ConsoleSink::new())]);
27
28    let event = log.event(0, "sync");
29
30    // This V7 event is selected only because the sync override allows it.
31    event.verbosity(7).debug("batch details");
32}
examples/file_logging.rs (line 33)
22fn main() -> Result<(), appcore_log::LogConfigError> {
23    // Keep generated output predictable and inside Cargo's ignored target tree.
24    let output_directory = PathBuf::from("target/appcore-log-example");
25    std::fs::create_dir_all(&output_directory).map_err(|_| LogConfigError::Sink(LogError::Io))?;
26
27    let active_file = output_directory.join("application.jsonl");
28
29    // Two rotations stay beside the active file. Older rotations move into
30    // archive/YYYY/MM and the complete archive never exceeds 120 files.
31    let archive_directory = output_directory.join("archive");
32    let mut policy = LogPolicy::new(Verbosity::V4);
33    policy.set_component("sync", Verbosity::V8);
34
35    let logger = LoggerConfig {
36        policy,
37        output: LogOutputMode::TerminalAndFile,
38        file: Some(FileSinkConfig {
39            path: active_file,
40            max_bytes: LOG_SIZE_8_MIB,
41            sync_each_write: false,
42            retention: 2,
43            archive: Some(FileArchiveConfig {
44                directory: archive_directory,
45                max_files: 120,
46            }),
47        }),
48        ..LoggerConfig::default()
49    }
50    .build()?;
51
52    let application = logger.dispatcher().event(0, "application");
53    let sync = logger.dispatcher().event(1, "sync.transport");
54
55    application.info("application ready; inspect target/appcore-log-example/application.jsonl");
56
57    // The parent component policy makes this V7 diagnostic visible.
58    sync.verbosity(7).debug("replication batch sent");
59
60    sync.warn("peer response was delayed");
61
62    let stats = logger.dispatcher().stats();
63    assert_eq!(stats.sink_failures, 0);
64
65    Ok(())
66}
Source

pub fn allows(&self, event: &LogEvent) -> bool

Reports whether an event is selected before serialization or sink I/O.

Source

pub fn sanitize(&self, event: &LogEvent) -> LogEvent

Produces the event accepted by its configured sensitivity boundary.

In Safe and Diagnostic modes all normal sinks receive redacted secrets and aliased typed paths. Sensitive mode is routed only to DNT sinks by the dispatcher; fields marked with LogEvent::secret remain redacted even there because they represent prohibited credential material.

Examples found in repository?
examples/safe_paths.rs (line 28)
18fn main() {
19    let mut policy = LogPolicy::default();
20
21    // The deployment provides trusted aliases instead of exposing host paths.
22    policy.paths.app_root = Some("/application".to_string());
23
24    let event = LogEvent::new(0, Severity::Info, Verbosity::V4, "storage", "opened")
25        .path("file", "/application/data/log.jsonl");
26
27    // Ordinary sinks receive `<APP_ROOT>/data/log.jsonl`, never the raw path.
28    let _safe = policy.sanitize(&event);
29}
Source

pub fn sanitize_owned(&self, value: LogEvent) -> LogEvent

Sanitizes an owned event without cloning its message or metadata.

Source

pub const fn sensitive_warning() -> &'static str

Returns the warning an application must surface when it enables encrypted sensitive diagnostics.

Trait Implementations§

Source§

impl Clone for LogPolicy

Source§

fn clone(&self) -> LogPolicy

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 LogPolicy

Source§

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

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

impl Default for LogPolicy

Source§

fn default() -> Self

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

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<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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> Same for T

Source§

type Output = T

Should always be Self
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, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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.