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: boolEnables full typed-path output only by explicit configuration.
sensitivity: SensitivitySafe, Diagnostic or explicit encrypted Sensitive output.
paths: PathAliasesTrusted aliases for typed local path fields.
Implementations§
Source§impl LogPolicy
impl LogPolicy
Sourcepub fn new(verbosity: Verbosity) -> Self
pub fn new(verbosity: Verbosity) -> Self
Creates a safe policy with one global verbosity threshold.
Examples found in repository?
More examples
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}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}Sourcepub fn set_component(
&mut self,
component: impl Into<String>,
verbosity: Verbosity,
)
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?
More examples
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}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}Sourcepub fn allows(&self, event: &LogEvent) -> bool
pub fn allows(&self, event: &LogEvent) -> bool
Reports whether an event is selected before serialization or sink I/O.
Sourcepub fn sanitize(&self, event: &LogEvent) -> LogEvent
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?
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}Sourcepub fn sanitize_owned(&self, value: LogEvent) -> LogEvent
pub fn sanitize_owned(&self, value: LogEvent) -> LogEvent
Sanitizes an owned event without cloning its message or metadata.
Sourcepub const fn sensitive_warning() -> &'static str
pub const fn sensitive_warning() -> &'static str
Returns the warning an application must surface when it enables encrypted sensitive diagnostics.