OSG修改日誌輸出到檔案

2021-08-27 08:39:46 字數 4129 閱讀 2095

osg嵌入到mfc後,就沒有控制台了,為了方便看osg的各種資訊,所以要把輸入日誌列印到文字。

原始碼路徑:

標頭檔案:openscenegraph-3.7.0\include\osg\notify

原始檔:openscenegraph-3.7.0\src\osg\notify.cpp

日誌通知等級

enum

notifyseverity ;

先別激動,來看看什什麼等級的日誌能notify

#define osg_notify(level) if (osg::isnotifyenabled(level)) osg::notify(level)

#define osg_always osg_notify(osg::always)

#define osg_fatal osg_notify(osg::fatal)

#define osg_warn osg_notify(osg::warn)

#define osg_notice osg_notify(osg::notice)

#define osg_info osg_notify(osg::info)

#define osg_debug osg_notify(osg::debug_info)

#define osg_debug_fp osg_notify(osg::debug_fp)

if (osg::isnotifyenabled(level)) osg::notify(level),如果osg::isnotifyenabled(level))返回真就通知,來看看裡面都寫了什麼邏輯:

#ifndef osg_notify_disabled

bool osg::isnotifyenabled( osg::notifyseverity severity )

#endif

上面說的好好注意下,我被坑過,以為把等級設定成always是全部訊息都列印,其實上什麼訊息都不被列印!!!!!

預設的通知等級跟通知輸出設定

struct notifysingleton

if(stringosgnotifylevel.find("always")!=std::string

::npos) _notifylevel=osg::always;

else

if(stringosgnotifylevel.find("fatal")!=std::string

::npos) _notifylevel=osg::fatal;

else

if(stringosgnotifylevel.find("warn")!=std::string

::npos) _notifylevel=osg::warn;

else

if(stringosgnotifylevel.find("notice")!=std::string

::npos) _notifylevel=osg::notice;

else

if(stringosgnotifylevel.find("debug_info")!=std::string

::npos) _notifylevel=osg::debug_info;

else

if(stringosgnotifylevel.find("debug_fp")!=std::string

::npos) _notifylevel=osg::debug_fp;

else

if(stringosgnotifylevel.find("debug")!=std::string

::npos) _notifylevel=osg::debug_info;

else

if(stringosgnotifylevel.find("info")!=std::string

::npos) _notifylevel=osg::info;

else std::cout

<<

"warning: invalid osg_notify_level set ("

<")"<}

// setup standard notify handler

osg::notifystreambuffer

*buffer = dynamic_cast*>(_notifystream.rdbuf());

if (buffer &&

!buffer->getnotifyhandler())

buffer->setnotifyhandler(new standardnotifyhandler);

}osg::notifyseverity _notifylevel;

osg::nullstream _nullstream;

osg::notifystream _notifystream;

};

可以看出來,預設等級是osg::notice,然後會到系統的環境變數名為:osg_notify_level去讀使用者設定的通告等級,環境變數設定的格式為:

[變數名:值]->[osg_notify_level :notice ]

使用者能干預的設定

再看標頭檔案有4個匯出的函式為:

extern osg_export void setnotifylevel(notifyseverity severity);

/** get the notify level. */

extern osg_export notifyseverity getnotifylevel();

/** initialize notify level. */

extern osg_export bool initnotifylevel();

#ifdef osg_notify_disabled

inline bool isnotifyenabled(notifyseverity)

#else

/** is notification enabled, given the current setnotifylevel() setting? */

extern osg_export bool isnotifyenabled(notifyseverity severity);

#endif

extern osg_export void setnotifyhandler(notifyhandler *handler);

/** get currrent notification handler. */

extern osg_export notifyhandler *getnotifyhandler();

這些函式就是使用者能呼叫的,看函式名不難理解其用意,其中我們需要關心的就是

setnotifylevelsetnotifyhandler,乙個是設定通知的等級,乙個是設定如何處理通告。通告的等級不難理解,如何處理通知看函式的傳入引數為notifyhandler *handler,所以我們需要繼承這個類重寫裡面的方法來實現。

class osg_export notifyhandler : public osg::referenced

;

寫好後在呼叫的地方set一下就ok了。

//重定向osg日誌輸出

class roadbednotifyhandler :public osg::notifyhandler

else}}

};/*呼叫*/

//設定成info就行了,debug_fp每一幀都有n條訊息吃不消

osg::setnotifylevel(osg::notifyseverity

::info);

osg::setnotifyhandler(new roadbednotifyhandler);

springboot日誌輸出到檔案

今天來談一談日誌,主要是說一說springboot的日誌,因為最近在學習springboot。首先在寫 的時候,要養成記日誌的習慣,這點真的很重要,因為之前吃了很多虧。過去我對日誌很不在意,該有的日誌沒有,不該有的日誌卻隨意輸出。新換的工作,上司對日誌有嚴格的要求,也就慢慢開始注意了。一般而言,乙個...

修改日誌摘要

修改日誌摘要 頭看了我的日誌摘要部件,覺得還行,當時提出了一點建議和發現了乙個bug。建議是 字型放大半號。這點建議我也是同意的,所以,決定要將它改過來。這個改動不會很大,用不了兩天,問題出在那個要命的bug上。既然是摘要,當然就不能將文章通篇都顯示出來,所以,需要擷取一部分。但是,在擷取的時候出現...

Kettle日誌輸出到檔案方法

轉 網上有很多關於如何實現kettle日誌輸出到日誌檔案的方法,但需要修改 重新編譯,比較麻煩。這裡面提供的方法可以解決兩個問題 1 把日誌輸出到檔案 2 日誌的時間精確到毫秒 有時kettle執行的很快,1 秒之內就輸出好幾條記錄,而預設日誌的時間只到秒級,這樣日誌的順序就是混亂的。用這種方法就可...