Skip to content

Filtering Example ​

Learn how to filter log messages based on level, module, or content.

Basic Filtering ​

zig
const std = @import("std");
const logly = @import("logly");

pub fn main() !void {
    var gpa = std.heap.GeneralPurposeAllocator(.{}){};
    defer _ = gpa.deinit();
    const allocator = gpa.allocator();

    // Enable colors on Windows
    _ = logly.Terminal.enableAnsiColors();

    const logger = try logly.Logger.init(allocator);
    defer logger.deinit();

    // Create a filter
    var filter = logly.Filter.init(allocator);
    defer filter.deinit();

    // Add minimum level filter - only warning and above
    try filter.addMinLevel(.warning);

    // Apply filter to logger
    logger.setFilter(&filter);

    // Only warning and above will pass
    try logger.debug("This won't appear", @src());  // Filtered out
    try logger.info("This won't appear", @src());   // Filtered out
    try logger.warn("This will appear", @src());    // Passes filter (short alias)
    try logger.err("This will appear", @src());     // Passes filter
}

Module-Based Filtering ​

zig
// Filter by module prefix
var filter = logly.Filter.init(allocator);
defer filter.deinit();

try filter.addModulePrefix("database");  // Only from "database" module

logger.setFilter(&filter);

// Create scoped logger
const db_logger = logger.scoped("database");
try db_logger.info("This will appear", @src());     // Module matches

try logger.info("This won't appear", @src());       // No module, filtered

Message Content Filtering ​

zig
var filter = logly.Filter.init(allocator);
defer filter.deinit();

// Deny logs containing sensitive keywords
try filter.addMessageFilter("password", .deny);
try filter.addMessageFilter("secret", .deny);

logger.setFilter(&filter);

try logger.info("Normal message", @src());           // Passes
try logger.info("User password changed", @src());    // Filtered (contains "password")

Filter Presets ​

zig
const FilterPresets = logly.FilterPresets;

// Production: info and above (excludes trace/debug)
var prod_filter = try FilterPresets.production(allocator);
defer prod_filter.deinit();

// Errors only: err and above
var error_filter = try FilterPresets.errorsOnly(allocator);
defer error_filter.deinit();

// Module-specific filter
var db_filter = try FilterPresets.moduleOnly(allocator, "database");
defer db_filter.deinit();

Filter Rule Types ​

Rule TypeMethodDescription
Min LeveladdMinLevel(level)Allow logs at or above level
Max LeveladdMaxLevel(level)Allow logs at or below level
Module PrefixaddModulePrefix(prefix)Allow logs from matching modules
Message ContainsaddMessageFilter(str, action)Allow/deny based on content

Filter Actions ​

  • .allow - Allow logs matching this rule
  • .deny - Block logs matching this rule

Combined Filtering ​

zig
var filter = logly.Filter.init(allocator);
defer filter.deinit();

// Multiple rules: info level minimum, exclude password-related
try filter.addMinLevel(.info);
try filter.addMessageFilter("password", .deny);

logger.setFilter(&filter);

Use Cases ​

  • Development: No filter (show all logs)
  • Production: Filter to warnings and above
  • Debugging: Enable debug for specific modules only
  • Security: Filter out PII-containing messages

New Methods (v0.0.9) ​

zig
var filter = logly.Filter.init(allocator);
defer filter.deinit();

// Add rules
try filter.addMinLevel(.warning);
try filter.addModulePrefix("database.", .allow);
try filter.addMessageFilter("password", .deny);

// Batch evaluation (more efficient for multiple records)
var results: [100]bool = undefined;
filter.shouldLogBatch(&records, &results);

// Fast path check
if (filter.allowsAll()) {
    // No rules, skip evaluation
}

// Statistics
const allowed = filter.allowedCount();
const denied = filter.deniedCount();
const total = filter.totalProcessed();
filter.resetStats();

// State
const count = filter.count();  // Number of rules
const has = filter.hasRules();
const empty = filter.isEmpty();

// Disable filter
filter.disable();

Aliases ​

AliasMethod
checkshouldLog
evaluateshouldLog
minLeveladdMinLevel
minaddMinLevel
maxLeveladdMaxLevel
maxaddMaxLevel
moduleFilteraddModulePrefix
addPrefixaddModulePrefix
messageFilteraddMessageFilter
resetclear
removeAllclear
ruleCountcount
lengthcount

See Also ​

Released under the MIT License.