如何使用log4rs创建自定义过滤器类型



唯一可用的过滤器是级别阈值,但我想通过特定的target: $expr进行过滤。我如何通过编程(或在yml文件中(让log4rs知道我需要一种不同的过滤器?我是否需要添加一个自定义功能来适应添加实现过滤器特性的新过滤器类型?

根据阈值过滤器类型文档中的源代码,我尝试使用所有相关的实现来实现我自己的过滤器类型。我甚至在过滤器的- kind:部分.yml配置文件中指定了自定义过滤器名称。log4rs还需要什么来实现这样的东西?

此外,当我运行let handle = log4rs::load_config_file("../log4rs.yml", Default::default()).unwrap();时,我收到以下错误

log4rs:反序列化附加到appender的筛选器时出错custom_filter_appender:没有用于类型custom_filter注册的筛选器反序列化程序

尽管我已经为所述自定义过滤器明确定义了反序列化程序。

有几个问题需要回答:

  1. 首先,关于target: $expr的筛选,您只需创建一个与要筛选的目标名称相同的新记录器即可。这是因为log4rs只会将宏从log机箱发送到与记录器名称具有相同目标字符串的记录器。因此,这里正在进行一种内置的过滤
  2. 第二,关于需要自定义功能,您不需要。我将在下面展示的所有内容都不需要运行自定义功能
  3. 第三,也是最有趣的一点,是创建自定义过滤器的语法和形式。我将在下面详细说明必要的修改:

首先配置log4rs.yml文件:

appenders:
custom_filter_appender:
kind: file
path: "log/custom_filter.log"
filters:
- kind: custom_filter
interesting_field: interesting_value
encoder:
pattern: "{d} {m}{n}"
root:
level: error
loggers:
filter_logger:
level: <level you want to filter by>
appenders:
- custom_filter_appender
additive: false

我上面所做的说明了使用配置文件用log4rs配置自定义筛选器所必需的内容。请注意,过滤器连接到附加程序,附加程序连接到记录器。这是连接事物的唯一方法。接下来,我将详细介绍custom_filter.rs中自定义过滤器所需的特性实现,以及它们将如何影响表示custom_filter的字段。

// First remember to include the appropriate log4rs or whatever other libraries you want in the custom_filter.rs file
#[derive(Deserialize)]
pub struct CustomFilterConfig {
interesting_field: InterestingFieldType,
}
#[derive(Debug)]
pub struct CustomFilter {
interesting_field: InterestingFieldType,
}
impl CustomFilter {
/// Creates a new `CustomFilter` with the specified interesting field.
pub fn new(interesting_field: InterestingFieldType,) -> CustomFilter {
CustomFilter { interesting_field }
}
}
impl Filter for CustomFilter {
fn filter(&self, record: &Record) -> Response {
if <Some comparison about self.interesting_field> {
Response::Accept
} else {
Response::Reject
}
}
}
pub struct CustomFilterDeserializer;
impl Deserialize for CustomFilterDeserializer {
type Trait = dyn Filter;
type Config = CustomFilterConfig;
fn deserialize(
&self,
config: CustomFilterConfig,
_: &Deserializers,
) -> Result<Box<dyn Filter>, Box<dyn Error + Sync + Send>> {
Ok(Box::new(CustomFilter::new(config.interesting_field)))
}
}

如果log4rs要祈祷识别并运行过滤器,那么所有这些都必须实现。请记住,只有与名称filter_logger(在本例中(具有相同目标的log板条箱宏才会进入此筛选器进行筛选。现在要完成这项工作,我们需要知道如何从main.rs中的一个文件中设置log4rs配置,并添加正确的过滤器,以便使用。

let mut custom_filter_deserializer = log4rs::file::Deserializers::new();
custom_filter_deserializer.insert(
"custom_filter",
crate::custom_filter::CustomFilterDeserializer,
);
log4rs::init_file("log4rs.yml", custom_filter_deserializer).unwrap();

这应该是您自己使用log4rs配置自定义过滤器所需要的一切。

最新更新