2013-05-14 51 views
5

我在使用記錄框架時遇到了一些問題。我有一個配置文件如下:Poco Logging Framework中記錄器層次結構的問題

# core channel 
logging.channels.c1.class = FileChannel 
logging.channels.c1.path = <somePath>/core.log 
logging.channels.c1.archive = timestamp 
logging.channels.c1.times = utc 
logging.channels.c1.rotation = daily 
logging.channels.c1.formatter.class = PatternFormatter 
logging.channels.c1.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t 

# core logger 
logging.loggers.l1.name = core 
logging.loggers.l1.level = information 
logging.loggers.l1.channel = c1 

我的程序使用波科::的Util:ServerApplication框架,從子系統架構中獲益。我有多個子系統,每個子系統都存儲對使用Poco :: Logger :: get(「logger name」)方法獲得的Poco :: Logger對象的引用。我試圖使用日誌層次結構,將上面配置文件中顯示的「核心」日誌作爲我的日誌記錄層次結構的根目錄。下面的代碼舉例說明了我在每個系統中所做的工作:

Subsystem1::Subsystem1() : 
    Poco::Util::Subsystem(),  
    logger_(Poco::Logger::get("core." + std::string(name()))), 
     ... 

Subsystem2::Subsystem2() : 
    Poco::Util::Subsystem(),  
    logger_(Poco::Logger::get("core." + std::string(name()))), 
     ... 

這適用於日誌記錄。這很好,因爲我已經從屬性文件繼承了配置,並且每個子系統將具有不同的Poco :: Message源名稱,從而可以輕鬆識別日誌條目來自哪個子系統。

當我嘗試更改記錄器實例的屬性(例如,來自Subsystem1的記錄器)時,問題就到了。例如,如果我改變頻道的路徑,則改變會傳播到整個層次結構。下面的代碼演示了這個問題:

Poco::Logger& subsystem1Logger = Poco::Logger::get("core.Subsystem1"); 
Poco::Logger& subsystem2Logger = Poco::Logger::get("core.Subsystem2"); 
subsystem1Logger.getChannel()->close(); //without this, the change to the channel's path does nothing 
subsystem1Logger.getChannel()->setProperty("path", <someOtherPath>/core2.log); // Ok, it's changed 
poco_information(subsystem1Logger "some message"); // Ok, it logs to <someOtherPath>/core2.log 
poco_information(subsystem2Logger "some message"); // NOT OK, it also logs to <someOtherPath>/core2.log instead of <somePath>/core.log 

我很困惑,因爲它是在波蘇:: Logger類的頭文件中指出,「一旦記錄器已創建並繼承了通道和水平從它的祖先開始,它就失去了與它的聯繫,所以記錄器級別或通道的改變不會影響它的後代「。

順便說一句,我的根記錄器(核心)也受到變化的影響。

我錯過了什麼嗎? 謝謝。

波科庫版本:1.5.1

回答

3

我覺得你得到一個記錄器和信道之間的混淆。

的記錄器 核心 Core.Subsystem1 Core.Subsystem2

都連接到相同的信道C1,因爲它們是核心的一個副本被創建時就。

這是通過Logger.getChannel()函數更改的通道c1。

如果記錄器連接到不同的通道,那麼你的方法將工作。

+2

要解決這個問題,給每個記錄器一個單獨的通道。使用'subsystem2Logger.setChannel(......);'設置一個新頻道。 [記錄介紹]中有例子(http://pocoproject.org/slides/110-Logging.pdf)。 –