是否可以爲log4cxx編寫自定義appender並通過屬性文件(如內置appender)配置它?如果可能的話,我寧願這樣做,而不必重新構建log4cxx(例如通過派生/擴展現有的appender)。Log4cxx自定義appender
你能指點我一個例子嗎?
是否可以爲log4cxx編寫自定義appender並通過屬性文件(如內置appender)配置它?如果可能的話,我寧願這樣做,而不必重新構建log4cxx(例如通過派生/擴展現有的appender)。Log4cxx自定義appender
你能指點我一個例子嗎?
您可以從AppenderSkeleton或WriterAppender繼承並獲得相同的基礎行爲,而無需重新構建log4cxx。
http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/test/cpp/vectorappender.h?view=markup http://svn.apache.org/viewvc/incubator/log4cxx/trunk/src/test/cpp/vectorappender.cpp?view=markup
brlcad的建議是正確的 - 在我的公司,我們已經用我們自己定製的appender此方法。
實際上,您可以從配置文件 - 類定義中的DECLARE_LOG4CXX_OBJECT(CustomAppenderClassName)等宏設置log4cxx環境。你可以通過你的「CustomAppenderClassName」來引用你的appender類型。 一個CONFIGFILE(老式)表示標準和定製的附加器,採用標準佈局爲自定義的appender:
# Set "realtime" logger level to DEBUG and create two appenders - one to be
# a standard rolling file appender, the other custom.
log4j.logger.realtime=ERROR, StandardAppender, CustomAppender
# StandardAppenderis set to be a RollingFileAppender
log4j.appender.StandardAppender=org.apache.log4j.RollingFileAppender
log4j.appender.StandardAppender.File=example.log
log4j.appender.StandardAppender.MaxFileSize=100KB
# Keep one backup file
log4j.appender.StandardAppender.MaxBackupIndex=1
# StandardAppender uses PatternLayout.
log4j.appender.StandardAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.StandardAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
# CustomAppender uses PatternLayout too
log4j.appender.CustomAppender=CustomAppenderClassName
log4j.appender.CustomAppender.layout=org.apache.log4j.PatternLayout
log4j.appender.CustomAppender.layout.ConversionPattern=%m
我加入了這個答案,因爲在大多數額定答案的鏈接似乎是從舊版本。我已經使用version 1.2.0創建了一個自定義的appender,它遵循在他們的SysLogAppender中完成的操作。在高層次上,您需要執行以下步驟:
void close()
和void append(const spi::InternalLoggingEvent& event)
下面是一個例子類與命名空間yournamespace :: ExampleCustomAppender類代碼:
#include <log4cplus/appender.h>
namespace yournamespace {
class ExampleCustomAppender : public Appender
{
public:
ExampleCustomAppender(const log4cplus::helpers::Properties & properties);
// Dtor
virtual ~ExampleCustomAppender();
// Methods
virtual void close();
/** Register the appender with the factory registry. */
static void registerAppender();
protected:
virtual void append(const spi::InternalLoggingEvent& event);
};
}
隨後的方法實現:
#include <log4cplus/spi/factory.h>
#include <sstream>
namespace yournamespace {
ExampleCustomAppender::ExampleCustomAppender(const helpers::Properties & properties)
: Appender(properties)
{
// if you want to use properties to configure your object do so here
}
ExampleCustomAppender::~ExampleCustomAppender()
{
}
void ExampleCustomAppender::registerAppender()
{
log4cplus::spi::AppenderFactoryRegistry & reg
= log4cplus::spi::getAppenderFactoryRegistry();
LOG4CPLUS_REG_PRODUCT(reg, "log4cplus::", ExampleCustomAppender,
yournamespace::, log4cplus::spi::AppenderFactory);
}
void ExampleCustomAppender::close()
{
// do anything you need to close the appender
closed = true;
}
// This method does not need to be locked since it is called by
// doAppend() which performs the locking
void LoggingCallbackAppender::append(const spi::InternalLoggingEvent& event)
{
if (!closed) {
std::stringstream logOutput;
layout->formatAndAppend(logOutput, event);
std::string outputString = logOutput.str();
}
}
}
,最後如何爲例它可以用在配置文件中:
log4cplus.rootLogger=INFO, STDOUT, ROLLING, EXAMPLE
// other definitions for STDOUT and ROLLING here and then ...
log4cplus.appender.EXAMPLE=log4cplus::ExampleCustomAppender
log4cplus.appender.EXAMPLE.layout=log4cplus::PatternLayout
log4cplus.appender.EXAMPLE.layout.ConversionPattern=%d{%m/%d %H:%M:%S} [%t] %-5p %c{2} - %m%n
我通過刪減一些其他代碼來完成這個代碼,所以它沒有以這種確切的格式編譯。讓我知道任何問題,我會糾正它。
如何讓它可以通過屬性文件進行配置,就像默認的appender一樣? – 2009-05-17 15:19:57
重寫函數`setOption`如下所示:http://stackoverflow.com/a/36498559/838509 – Andrzej 2016-04-08 11:40:22