log4cxx——是否可以使用配置文件中的自定义参数配置自定义附加程序?
log4cxx -- is it possible to configure a custom appender with custom arguments from a config file?
我需要在 log4cxx 中编写自定义附加程序。 This answer 描述了如何做。在 Java 中,在 log4j 中,自定义 appender 可以设计自定义参数。我添加了一个 属性 和一个 getter 和 setter:
private int myParameter = 0;
public void setMyParameter(int p) { myParameter = p; }
public int getMyParameter() { return myParameter; }
然后我可以在配置文件中使用 myParameter
,并且框架以某种方式知道如何用它配置我的 appender。
问题:log4cxx有类似的能力吗?对我来说,如果我得到一张带有属性的地图 map<string, string>
就足够了。
好的,我自己想出了答案。您需要覆盖成员函数 setOption
。它将被调用多次:每个读取选项一次。然后您覆盖函数 activateOptions
并在处理完所有选项后调用它。它可以用作触发器来使用读取参数初始化附加程序。
不如映射到 getters/setters 方便,但它完成了工作:
class CustomAppender : public AppenderSkeleton
{
int _myParameter = 0;
void initialize(int myParameter);
// ...
public:
void setOption(LogString const& option, LogString const& value) override
{
if (option == "MyParameter") try
{
_myParameter = boost::lexical_cast<int>(value);
}
catch (boost::bad_lexical_cast const&) {
// go with default
}
}
void activateOptions(helpers::Pool &) override
{
initialize(_myParameter);
}
};
我需要在 log4cxx 中编写自定义附加程序。 This answer 描述了如何做。在 Java 中,在 log4j 中,自定义 appender 可以设计自定义参数。我添加了一个 属性 和一个 getter 和 setter:
private int myParameter = 0;
public void setMyParameter(int p) { myParameter = p; }
public int getMyParameter() { return myParameter; }
然后我可以在配置文件中使用 myParameter
,并且框架以某种方式知道如何用它配置我的 appender。
问题:log4cxx有类似的能力吗?对我来说,如果我得到一张带有属性的地图 map<string, string>
就足够了。
好的,我自己想出了答案。您需要覆盖成员函数 setOption
。它将被调用多次:每个读取选项一次。然后您覆盖函数 activateOptions
并在处理完所有选项后调用它。它可以用作触发器来使用读取参数初始化附加程序。
不如映射到 getters/setters 方便,但它完成了工作:
class CustomAppender : public AppenderSkeleton
{
int _myParameter = 0;
void initialize(int myParameter);
// ...
public:
void setOption(LogString const& option, LogString const& value) override
{
if (option == "MyParameter") try
{
_myParameter = boost::lexical_cast<int>(value);
}
catch (boost::bad_lexical_cast const&) {
// go with default
}
}
void activateOptions(helpers::Pool &) override
{
initialize(_myParameter);
}
};