開源純C日誌函數庫iLOG3快速入門(6、日誌配置文件)

不知不覺寫了五篇,iLOG3的功能仍是挺豐富的,這也是我有時受不了的緣由,由於當初開發她的時候是定位爲簡單實現,郵箱裏網友們的需求很旺盛,有一種我不實現就不用的氣勢。

今天大體講一下iLOG3日誌函數庫如何用外部配置文件配置日誌句柄。一個日誌函數庫沒有用外部配置文件來配置的話那就不算是一個完整的日誌函數庫,當初這個功能並不是最重要。我開發iLOG3是分層分階段進行,先開發日誌句柄層,一個日誌句柄對應輸出一個介質(如文件),當有多個輸出介質需求時,再開發日誌句柄集合層,建立一個日誌句柄集合就能同時輸出多個介質,由代碼來建立日誌句柄及集合不夠靈活,因此就又開發了配置文件接口層,順手設計了第一種配置文件格式,與接口層對接,實現用配置文件來配置日誌句柄及集合。哪層對你方便你就用哪層,因地制宜。

一個配置日誌句柄的配置文件內容以下:
test_logconf.conf

output        FILE     test_logconf.log
level        INFO
styles        DATETIME|LOGLEVEL|PID|TID|SOURCE|FORMAT|NEWLINE
options        CHANGE_TEST
rotate_mode    SIZE
rotate_size    10MB
log_bufsize    1MB 5MB
在代碼裏這樣寫就實現了裝載配置文件來配置日誌句柄

#include "LOGCONF.h"
LOG    *g = NULL ;
g = CreateLogHandleFromConfig( "test_logconf.conf" , NULL ) ;
...
函數CreateLogHandleFromConfig內部邏輯是讀取簡單日誌配置文件,依次調用建立、設置函數構建日誌句柄,也就是等價於:

SetLogOutput( g , LOG_OUTPUT_FILE , "test_logconf.log" , LOG_NO_OUTPUTFUNC );
SetLogLevel( g , LOG_LEVEL_INFO );
SetLogStyles( g , LOG_STYLE_DATETIME|LOG_STYLE_LOGLEVEL|LOG_STYLE_PID|LOG_STYLE_TID|LOG_STYLE_SOURCE|LOG_STYLE_FORMAT|LOG_STYLE_NEWLINE , LOG_NO_STYLEFUNC );
SetLogOptions( g , LOG_OPTION_CHANGE_TEST );
SetLogRotateMode( g , LOG_ROTATEMODE_SIZE );
SetLogRotateSize( g , 10*1024*1024 );
SetLogBufferSize( g , 1*1024*1024 , -1 );
應用輸出日誌和關閉日誌句柄照常。
固然,你的配置文件可能須要從用戶主目錄開始定位,那麼把上述設置的文件名改成"$HOME/test_logconf.conf"便可。

若是須要掛接鉤子回調函數,設置
output       CALLBACK
而後在代碼中用函數SetLogOutputFuncDirectly、SetLogStyleFuncDirectly等設置回調函數,這個是省不掉的。

一個有趣的技巧
my_program.c -> my_program

#include "LOGCONF.h"
int main( int argc , char *argv[] )
{
    LOG    *g = NULL ;
    g = CreateLogHandleFromConfig( argv[0] , ".conf" ) ;
    ...
}
這樣就能實現可執行程序my_program和所在目錄下有一個主文件名同樣的對應日誌配置文件my_program.conf協同工做。

日誌句柄集合的配置也同樣簡單

id        hello
output        FILE    test_logconf.log
level        INFO
styles        DATETIME|LOGLEVEL|PID|TID|SOURCE|FORMAT|NEWLINE
options        CHANGE_TEST
rotate_mode    SIZE
rotate_size    10MB
log_bufsize    1MB     5MB

id        stdout
output        STDOUT
level        INFO
styles        DATETIME|LOGLEVEL|PID|TID|SOURCE|FORMAT|NEWLINE
代碼中這樣調用

#include "LOGSCONF.h"
LOGS    *gs = NULL ;
gs = CreateLogsHandleFromConfig( "test_logsconf.conf" , NULL ) ;
...
Log變成Logs便可,很好記,不是嗎? ^_^

你是否是以爲這樣的配置文件很簡陋,這也是我設計配置文件接口層的目的,你能夠利用該層函數與你特有的配置格式對接,實現各類各樣的配置格式來配置iLOG3的日誌句柄。好比XML標記語言

<log id="access">
    <output>FILE</output>
    <filename>$HOME$/log/access.log"</filename>
    <level>DEBUG</level>
    <styles>DATETIME|LOGLEVEL|PID|TID|FORMAT|NEWLINE</styles>
    <rotate_mode>SIZE</rotate_mode> ;
    <rotate_size>10MB</rotate_size>
</log>
或者是我原創的SML標記語言

log ( id = access )
{
    output = FILE ;
    filename = "$HOME$/log/access.log" ;
    level = DEBUG ;
    styles = "DATETIME|LOGLEVEL|PID|TID|FORMAT|NEWLINE" ;
    rotate_mode = SIZE ;
    rotate_size = 10MB ;
}




或者是某種極簡格式

access.DEBUG    "$HOME$/log/access.log",10MB,"DATETIME|LOGLEVEL|PID|TID|FORMAT|NEWLINE"
再或者是你所在項目要求的特定的統一格式。
你要開發的只是解析你喜歡的配置格式,而後用iLOG3配置文件接口層函數轉換配置文本爲內部類型

_WINDLL_FUNC int ConvertLogOutput_atoi( char *output_desc , int *p_log_output );
_WINDLL_FUNC int ConvertLogLevel_atoi( char *log_level_desc , int *p_log_level );
_WINDLL_FUNC int ConvertLogStyle_atol( char *line_style_desc , long *p_line_style );
_WINDLL_FUNC int ConvertLogOption_atol( char *log_option_desc , long *p_log_option );
_WINDLL_FUNC int ConvertLogRotateMode_atoi( char *rotate_mode_desc , int *p_rotate_mode );
_WINDLL_FUNC int ConvertBufferSize_atol( char *bufsize_desc , long *p_bufsize );
最後調用日誌句柄建立、設置函數構造日誌句柄便可。

我在最近開發的軟件hetao中採用SML做爲其配置格式,hetao主配置示例以下:

hetao
{
    logs
    {
        log ( id = access )
        {
            output = FILE ;
            filename = "$HOME$/log/access.log" ;
            level = DEBUG ;
            styles = "DATETIME|LOGLEVEL|PID|TID|FORMAT|NEWLINE" ;
            rotate_mode = SIZE ;
            rotate_size = 10MB ;
        }
        
        log ( id = error )
        {
            output = FILE ;
            filename = "$HOME$/log/error.log" ;
            level = ERROR ;
            styles = "DATETIME|LOGLEVEL|SOURCE|FORMAT|NEWLINE" ;
            rotate_mode = SIZE ;
            rotate_size = 10MB ;
        }
    }
    
    module
    {
        connection ( filename = "$HOME$/so/hetao_module_connection_epoll.so" )
        {
        }
        
        protocol ( filename = "$HOME$/so/hetao_module_protocol_http.so" )
        {
            max_header_size = 10KB ;
            
            root = "$HOME$/www" ;
            index_page = "index.html" ;
            error_pages
            {
                error_page { error = 403 ; page = "$HOME$/www/403.html" } ;
                error_page { error = 404 ; page = "$HOME$/www/404.html" } ;
                error_page { error = 500 ; page = "$HOME$/www/500.html" } ;
                error_page { error = 505 ; page = "$HOME$/www/505.html" } ;
            }
        }
    }
    
    server
    {
        listen_ip = "127.0.0.1" ;
        listen_port = 8080 ;
        max_connections = 1024 ;
    }
}
在代碼中這樣寫便可迅速自動構建出日誌句柄集合

gs = CreateLogsHandleFromConfig_SML( "hetao.conf" , "/hetao/logs" , NULL ) ;
CreateLogsHandleFromConfig_SML是我另外編寫的iLOG3配置SML格式函數庫iLOG3CONF_SML函數
期待您的iLOG3CONF_*

是否是越看越心動了?那就趕忙下載來玩玩吧
首頁傳送門 : http://git.oschina.net/calvinwilliams/iLOG3 源代碼包doc目錄中包含了用戶指南和參考手冊,裏面有更詳盡的說明
相關文章
相關標籤/搜索