mirror of
https://github.com/Nanaloveyuki/BitLogger.git
synced 2026-05-30 15:42:25 +00:00
📝 Add filter predicate API docs
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
---
|
||||
name: message-contains
|
||||
group: api
|
||||
category: filtering
|
||||
update-time: 20260512
|
||||
description: Create a reusable record predicate that matches records by message fragment.
|
||||
key-word:
|
||||
- message
|
||||
- filter
|
||||
- predicate
|
||||
- public
|
||||
---
|
||||
|
||||
## Message-contains
|
||||
|
||||
Create a `RecordPredicate` that returns `true` when a log message contains the given fragment. This helper is mainly useful for diagnostics, temporary routing, and focused debugging.
|
||||
|
||||
### Interface
|
||||
|
||||
```moonbit
|
||||
pub fn message_contains(fragment : String) -> RecordPredicate {}
|
||||
```
|
||||
|
||||
#### input
|
||||
|
||||
- `fragment : String` - Substring expected to appear in `rec.message`.
|
||||
|
||||
#### output
|
||||
|
||||
- `RecordPredicate` - Predicate that matches records whose message contains the fragment.
|
||||
|
||||
### Explanation
|
||||
|
||||
Detailed rules explaining key parameters and behaviors
|
||||
|
||||
- Matching uses `String::contains(...)` on the full message text.
|
||||
- The predicate is case-sensitive unless the message was normalized earlier.
|
||||
- This helper is convenient for ad hoc triage when targets or fields are not enough.
|
||||
- It should usually complement more stable filters rather than replace them in long-term configs.
|
||||
|
||||
### How to Use
|
||||
|
||||
Here are some specific examples provided.
|
||||
|
||||
#### When Watch A Temporary Error Pattern
|
||||
|
||||
When a debugging session focuses on one phrase:
|
||||
```moonbit
|
||||
let logger = Logger::new(console_sink())
|
||||
.with_filter(message_contains("retry failed"))
|
||||
```
|
||||
|
||||
In this example, only messages carrying that fragment remain visible.
|
||||
|
||||
#### When Combine With Target Filtering
|
||||
|
||||
When the same message should be isolated inside one subsystem:
|
||||
```moonbit
|
||||
let predicate = all_of([
|
||||
target_has_prefix("worker.sync"),
|
||||
message_contains("timeout"),
|
||||
])
|
||||
```
|
||||
|
||||
In this example, unrelated timeout messages from other targets are ignored.
|
||||
|
||||
### Error Case
|
||||
|
||||
e.g.:
|
||||
- If `fragment` is empty, the predicate effectively matches every message because every string contains an empty substring.
|
||||
|
||||
- If messages are localized or reformatted frequently, fragment-based matching can become brittle.
|
||||
|
||||
### Notes
|
||||
|
||||
1. Prefer field- or target-based filtering for stable production rules.
|
||||
|
||||
2. Message substring filters are most valuable during debugging and migration periods.
|
||||
|
||||
Reference in New Issue
Block a user