青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

socketref,再見!高德

https://github.com/adoggie

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  246 Posts :: 4 Stories :: 312 Comments :: 0 Trackbacks

常用鏈接

留言簿(54)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

本人一直使用的日志類,支持3種輸出方式(windows窗體,udp,常規(guī)文件),并格式化輸出:
  1
  2/*
  3    nvlog.h
  4    ----------------
  5    application logger
  6    2003.10     created        scott    
  7    2005.09.10    rebuild        scott
  8                created RegFileWriter,UdpWriter,WindowWriter to distinguish log data type
  9    2005.09.22    modified RegFileWriter::RegFileWriter()    scott
 10    2005.11.10    scott     add __FILE__,__LINE__
 11*/

 12
 13#ifndef _NVLOG
 14#define _NVLOG
 15
 16#ifdef _UNIX
 17 #include <unistd.h>
 18 #include <signal.h>
 19 #include <sys/socket.h>
 20 #include <fcntl.h>
 21 #include <netinet/in.h>
 22 #include <arpa/inet.h>
 23#endif
 24
 25#ifdef WIN32
 26 #include <windows.h>
 27#include <winsock.h>
 28#include <io.h>
 29#endif
 30
 31
 32#include <stdio.h>
 33#include <stdlib.h>
 34#include <string>
 35#include <string.h>
 36#include <stdarg.h>
 37#include <vector>
 38#include <algorithm>
 39
 40#include "nvlock.h"
 41#include "nvcalendar.h"
 42
 43class NVLog{
 44public:
 45    enum WriterType{
 46        UDP,    
 47        REGFILE,
 48        WINDOW,
 49        UNKNOWN
 50    }
;
 51
 52    class LogWriter{
 53    public:
 54        LogWriter(){
 55            _type = UNKNOWN;
 56        }

 57        
 58        virtual ~LogWriter(){
 59
 60        }

 61
 62        virtual int     Write(const char * data,unsigned int len){
 63            return 0;
 64        }

 65        virtual bool    Open(){
 66            return true;
 67        }

 68        virtual void    Close(){            
 69        }

 70
 71        WriterType    GetType(){
 72            return _type;
 73        }

 74    protected:
 75        WriterType    _type;
 76    }
;
 77    #ifdef WIN32
 78    class WindowWriter:public LogWriter{
 79    public:
 80
 81        virtual int     Write(const char * data,unsigned int len){
 82            if( _refind){
 83                return Write2(_win_title.c_str(),data,len);
 84            }

 85            return SendMessageToWindow(_hwnd,data,len);
 86        }

 87
 88        int     Write2(const char * wintitle,const char * data,unsigned int len){            
 89            HWND hwnd = FindWindow(0,wintitle);
 90            len = SendMessageToWindow(hwnd,data,len);
 91        //    CloseHandle(hwnd);
 92            return len;
 93        }

 94
 95        virtual bool    Open(){
 96            if( _refind){        //需要發(fā)送時(shí)發(fā)現(xiàn) 
 97                return true;
 98            }

 99            _hwnd = FindWindow(0,_win_title.c_str());
100            if!_hwnd){
101                //MessageBox(NULL,"cannot find window",_win_title.c_str(),MB_OK);
102                return false;
103            }

104            return true;
105        }

106        virtual void    Close(){
107            if( _hwnd ){
108                //CloseHandle(_hwnd);
109            }

110
111        }

112
113        WindowWriter(const char * wintitle,bool refind=false){
114            _win_title = wintitle;
115            _hwnd = NULL;
116            _type = WINDOW;
117            _refind = refind;
118        }

119
120    protected:
121        int SendMessageToWindow(HWND hwnd ,const char * data,unsigned int len){
122            if( hwnd == NULL){
123                return 0;
124            }

125            COPYDATASTRUCT cds;
126            cds.lpData =(void*)data;
127            cds.cbData = len;
128            SendMessage(hwnd,WM_COPYDATA ,(UINT)hwnd,(long)&cds);
129            return len;
130        }

131    private:
132        std::string        _win_title;
133        HWND            _hwnd;
134        bool            _refind;
135    }
;
136    #endif
137    
138    class RegFileWriter:public LogWriter{
139    public:
140        typedef void (*OnReachedMaxFileSizeCB)(std::string &file);
141        RegFileWriter(const char * file){
142            _cb_maxsize = NULL;
143            _fp = NULL ;
144            _file = file;
145            _type = REGFILE;
146            _cur_size = 0;
147            SetMaxFileSize();
148        }

149        virtual void OnReachedMaxFileSize(){
150            Close();
151            Open();
152        }

153        //void SetRoundTime(unsigned int round_time);    //達(dá)到指定時(shí)間循環(huán)到文件頭部        
154        void SetMaxFileSize(unsigned int max_size = 1024*1024*2,OnReachedMaxFileSizeCB cb=NULL){
155            _max_size = max_size;
156            _cb_maxsize = cb;
157            
158        }

159        virtual bool    Open(){
160            _fp = fopen(_file.c_str(),"w");
161            if!_fp){
162                return false;
163            }

164            //fseek(fp,0,SEEK_END);
165            _cur_size = 0;//ftell(fp);
166            return true;
167        }

168
169        virtual int     Write(const char * data,unsigned int len){
170            int ret;
171            if( _cur_size >= _max_size){
172                OnReachedMaxFileSize();
173            }

174            if( _fp == NULL){
175                return -1;
176            }

177            ret = fwrite(data,len,1,_fp);
178            fflush(_fp);
179            _cur_size += len;
180            return len;
181        }

182
183        void    Close(){
184            if( _fp ){
185                fclose(_fp);
186            }

187            _fp = NULL;            
188        }

189        
190    private:
191        unsigned int _cur_size,_max_size;
192        OnReachedMaxFileSizeCB    _cb_maxsize;
193        
194        FILE *         _fp;
195        std::string _file;
196    }
;
197    class Socket{
198    public:
199        Socket(){
200            _sock = -1;
201        }

202        
203
204    protected:
205        std::string        _host;
206        unsigned short    _port;
207        int    _sock;
208    }
;
209    class UdpWriter:public Socket,public LogWriter{
210    public:
211
212        ~UdpWriter(){
213            Close();
214        }

215
216        UdpWriter(const char * dest,unsigned short port){
217            _host =  dest;
218            _port =  port;
219            _type =  UDP;
220        }

221        
222        virtual int     Write(const char * data,unsigned int len){
223            if( _sock < 0 ){
224                return 0;
225            }

226            return send(_sock,data,len,0);
227        }

228
229        virtual bool    Open(){
230            sockaddr_in sa;    
231            #ifdef WIN32
232            WORD wVersionRequested;
233            WSADATA wsaData;
234            int err; 
235            wVersionRequested = MAKEWORD( 22 );
236            err = WSAStartup( wVersionRequested, &wsaData );
237            if ( err != 0 ) {
238                return false;
239            }

240            #endif
241            sa.sin_family = AF_INET;
242            sa.sin_port = htons(_port);
243            sa.sin_addr.s_addr = inet_addr(_host.c_str());                    
244            _sock = socket(AF_INET,SOCK_DGRAM,0);
245            if( _sock <0  ){
246                return false;
247            }

248            connect(_sock,(sockaddr*)&sa,sizeof(sa));
249            return true;
250        }

251
252        virtual void    Close(){
253            if( _sock >= 0 ){
254#ifdef  WIN32
255                closesocket (_sock);
256#endif
257#ifdef _UNIX
258                close(_sock);
259#endif
260                _sock = -1;
261            }

262        }

263    }
;
264
265
266    enum LEVEL{
267        LOG_ERROR     =0x01,        
268        LOG_WARNING =0x02,
269        LOG_MESSAGE =0x04,
270        LOG_DEBUG    =0x08,
271        LOG_ALL    =LOG_ERROR|LOG_WARNING|LOG_MESSAGE|LOG_DEBUG
272    }
;        
273
274    bool     SetWriter(LogWriter * w){
275        _writer_lock.Lock();
276        _writer_list.push_back(w);
277        _writer_lock.Unlock();
278        return true;
279    }

280
281    void    RemoveWriter(LogWriter*w){
282        std::vector<LogWriter* >::iterator itr;
283        _writer_lock.Lock();
284        itr = std::find(_writer_list.begin(),_writer_list.end(),w);
285        if(itr != _writer_list.end()){
286            _writer_list.erase(itr);
287        }

288        _writer_lock.Unlock();
289    }

290
291    NVLog(){
292        SetFormat();
293        SetLevel();
294    }

295    ~NVLog(){
296
297    }

298
299    void     SetLevel(int level = LOG_ERROR|LOG_WARNING|LOG_MESSAGE|LOG_DEBUG){
300        _level = level;
301    }

302    #define LOG_MAX_BUFF_SIZE 1024*60
303    void    Error(const char * fmt,){
304        va_list marker;        
305        char buff[LOG_MAX_BUFF_SIZE];
306        va_start(marker,fmt);    
307        vsprintf(buff,fmt,marker);
308        va_end(marker); 
309        PrintString(LOG_ERROR,buff);
310    }

311    void    Debug(const char * fmt,){
312        va_list marker;        
313        char buff[LOG_MAX_BUFF_SIZE];
314        va_start(marker,fmt);    
315        vsprintf(buff,fmt,marker);
316        va_end(marker); 
317        PrintString(LOG_DEBUG,buff);
318    }

319    void    Warning(const char * fmt,){
320        va_list marker;        
321        char buff[LOG_MAX_BUFF_SIZE];
322        va_start(marker,fmt);    
323        vsprintf(buff,fmt,marker);
324        va_end(marker); 
325        PrintString(LOG_WARNING,buff);
326    }

327    void    Message(const char * fmt,){
328        va_list marker;        
329        char buff[LOG_MAX_BUFF_SIZE];
330        va_start(marker,fmt);    
331        vsprintf(buff,fmt,marker);
332        va_end(marker); 
333        PrintString(LOG_MESSAGE,buff);
334    }

335    void    Print(int level,const char * fmt,){
336        va_list marker;        
337        char buff[LOG_MAX_BUFF_SIZE];
338        va_start(marker,fmt);    
339        vsprintf(buff,fmt,marker);
340        va_end(marker); 
341        PrintString(level,buff);
342    }

343
344    void    SetFormat(const char *format="<TIME>\t<LEVEL>\t<MESSAGE>\n"){
345        _format = format;
346    }

347private:
348    void    PrintString(int level,const char * data);
349private:
350    std::vector<LogWriter* > _writer_list;
351    NVLock                    _writer_lock;
352    std::string                _format;    // "<LOGLEVEL><LINENO><TIME><MESSAGE>\n"
353    unsigned int             _level;
354}
;
355
356inline 
357void    NVLog::PrintString(int level,const char * data){
358    char *levelname;    
359    if!(level & _level) ){    
360        return;    
361    }

362    
363    switch(level){
364        case LOG_ERROR:
365            levelname = "ERROR";
366            break;
367        case LOG_WARNING:
368            levelname = "WARNING";
369            break;
370        case LOG_MESSAGE:
371            levelname = "MESSAGE";
372            break;
373        case LOG_DEBUG:
374            levelname = "DEBUG";
375            break;
376        default:
377            return;
378    }

379    if( _format == "" ){
380        return ;
381    }

382    
383    std::string format;
384    char * mark;
385    char * occur;
386    format = _format;
387    mark = "<LEVEL>";
388    int len;
389    len = strlen(mark);
390    if( occur = (char*)strstr( format.c_str(),(const char*)mark) ) {
391        format.replace( occur-format.c_str(),len,levelname);
392    }

393    mark = "<TIME>";
394    len = strlen(mark);
395    if( occur = (char*)strstr( format.c_str(),(const char*)mark) ) {
396        format.replace( occur-format.c_str(),len,NVCalendar::GetCurTimeStr().c_str());
397    }

398    mark = "<MESSAGE>";
399    len = strlen(mark);
400    if( occur = (char*)strstr( format.c_str(),mark) ) {
401        format.replace( occur-format.c_str(),len,data);
402    }

403    std::vector<LogWriter* >::iterator itr;
404    _writer_lock.Lock();
405    for( itr= _writer_list.begin();itr!=_writer_list.end();itr++){
406        (*itr)->Write(format.c_str(),format.size());
407    }
    
408    _writer_lock.Unlock();
409}

410
411
412
413#define NVLOG_ADD_UDP_WRITER(log,host,port)    \
414                    NVLog::UdpWriter * w = new NVLog::UdpWriter(host,port);\
415                    w->Open();\
416                    (log).SetWriter(w);
417
418#endif
419
420
posted on 2005-12-11 20:31 放屁阿狗 閱讀(3875) 評論(4)  編輯 收藏 引用 所屬分類: unix/linux/solaris/sco-unix/novell 、視頻監(jiān)控

Feedback

# re: 短小的日志類 2005-12-14 14:05 小明
如果我想每天生成一個(gè)日志文件,該怎么辦呢?

另外,WindowWriter不提供一個(gè)hWnd作為參數(shù)的ctor,真是奇怪。  回復(fù)  更多評論
  

# re: 短小的日志類 2006-04-03 10:39 橙子
贊一個(gè)。 :)

不錯(cuò)。  回復(fù)  更多評論
  

# re: 短小的日志類 2007-12-05 23:39 limx
看起來很不錯(cuò)的!嗬嗬。請問 有 "nvlock.h" "nvcalendar.h"這兩個(gè)文件嗎? 有的話,可否發(fā)份到limx54@163.com 我想試試效果。謝謝  回復(fù)  更多評論
  

# re: 短小的日志類 2009-02-05 16:43 travor
挺好的能否 將 "nvlock.h" "nvcalendar.h"這兩個(gè)文件發(fā)份到zhstone@tom.com 謝謝   回復(fù)  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美国产va在线影院| 亚洲国产成人精品女人久久久| 欧美色图麻豆| 亚洲人成网站999久久久综合| 好吊视频一区二区三区四区| 国产亚洲一区在线播放| 狠狠色狠狠色综合| 亚洲大片av| 一区二区精品| 久久er精品视频| 欧美1区免费| 一区二区三区**美女毛片| 亚洲欧美一级二级三级| 久久影视精品| 欧美三区免费完整视频在线观看| 国产精品无码永久免费888| 在线观看免费视频综合| 中文日韩电影网站| 久久婷婷国产麻豆91天堂| 亚洲黄页视频免费观看| 亚洲女同精品视频| 欧美ab在线视频| 国产精品日韩欧美一区二区三区 | 久久久精品日韩欧美| 欧美不卡激情三级在线观看| 一区二区欧美精品| 老牛影视一区二区三区| 国产精品网站在线| 一区二区免费在线观看| 老**午夜毛片一区二区三区| 99视频在线观看一区三区| 久久久久久免费| 欧美四级在线| 亚洲精品国产精品国自产观看浪潮 | 亚洲一区二区三区中文字幕| 欧美成人精品在线播放| 国内外成人在线| 亚洲欧美久久久久一区二区三区| 欧美电影在线| 久久久www| 国产亚洲欧美色| 性欧美精品高清| 夜夜爽夜夜爽精品视频| 欧美 日韩 国产一区二区在线视频 | 国产色综合天天综合网| 日韩图片一区| 欧美超级免费视 在线| 亚洲欧美网站| 国产免费观看久久黄| 亚洲欧美日韩精品久久久久| 亚洲精品国产精品国产自| 美女啪啪无遮挡免费久久网站| 国产视频久久| 欧美一区二区三区啪啪| 亚洲一区在线观看免费观看电影高清| 欧美三级电影大全| 在线亚洲欧美| 9色精品在线| 欧美性猛片xxxx免费看久爱| 亚洲深夜福利视频| 亚洲精品美女久久7777777| 亚洲大胆美女视频| 男男成人高潮片免费网站| 久久久国产精品一区| 韩国久久久久| 欧美激情一区二区三区在线| 女女同性精品视频| 日韩午夜三级在线| 夜夜嗨av一区二区三区四区 | 精品动漫3d一区二区三区| 久久人人爽国产| 久久免费视频观看| 亚洲欧洲精品成人久久奇米网| 亚洲国产精品va在线观看黑人| 欧美激情第三页| 亚洲自拍三区| 性18欧美另类| 1024亚洲| 亚洲精品网站在线播放gif| 欧美日韩一级黄| 欧美诱惑福利视频| 老司机凹凸av亚洲导航| 99国产成+人+综合+亚洲欧美| 亚洲精品乱码视频| 国产色爱av资源综合区| 欧美成人高清视频| 欧美亚州韩日在线看免费版国语版| 亚洲一区免费网站| 久久久精品视频成人| 亚洲毛片一区| 亚欧成人精品| 日韩午夜精品| 久久精品综合一区| 一区二区日韩免费看| 午夜精品久久久久久久99热浪潮| 亚洲高清自拍| 亚洲在线日韩| 日韩午夜av| 久久久久久久一区二区三区| 亚洲天堂成人在线视频| 久久久99免费视频| 亚洲欧美99| 欧美经典一区二区三区| 最近看过的日韩成人| 久久久久一区二区| 亚洲色图自拍| 免播放器亚洲| 久久久91精品国产| 欧美日韩中文另类| 欧美激情偷拍| 禁断一区二区三区在线| 亚洲无亚洲人成网站77777| 亚洲狠狠丁香婷婷综合久久久| 中文在线一区| 9久re热视频在线精品| 老鸭窝毛片一区二区三区| 性久久久久久| 国产精品高潮呻吟| 日韩亚洲精品视频| 亚洲精品欧美激情| 久久久久久高潮国产精品视| 欧美一区=区| 国产精品久久久久久一区二区三区 | 亚洲网友自拍| 在线综合+亚洲+欧美中文字幕| 久久午夜国产精品| 久久综合五月天婷婷伊人| 国产日韩一区二区| 先锋影音一区二区三区| 午夜一区二区三区不卡视频| 国产精品国产三级国产a| 亚洲日本一区二区三区| 亚洲日本aⅴ片在线观看香蕉| 久久视频在线看| 美女视频黄a大片欧美| 狠狠88综合久久久久综合网| 欧美在线影院在线视频| 久久久久久久网| 免费观看一级特黄欧美大片| 国产一区二区中文| 久久精品人人爽| 蜜桃久久精品乱码一区二区| 亚洲国产小视频| 欧美精品成人91久久久久久久| 亚洲国产日韩欧美一区二区三区| 亚洲人午夜精品免费| 欧美激情一区二区三区 | 国产精品99久久99久久久二8 | 久久国产日韩| 久热综合在线亚洲精品| 亚洲激情在线视频| 欧美日韩高清免费| 亚洲性人人天天夜夜摸| 久久精品系列| 亚洲国产清纯| 欧美日韩精品在线| 亚洲综合欧美| 欧美二区在线播放| 一区二区三区www| 国产精品日产欧美久久久久| 一本大道久久a久久精品综合| 久久久久久网址| 黑人一区二区| 欧美激情第三页| 亚洲欧美在线一区| 欧美国产日本高清在线| 亚洲一区二区三区欧美| 国产一区二区电影在线观看| 欧美凹凸一区二区三区视频| 中国成人在线视频| 欧美国产精品一区| 亚洲欧美日韩另类| 在线日本成人| 国产精品人人爽人人做我的可爱| 久久综合99re88久久爱| 一本色道88久久加勒比精品| 久久午夜羞羞影院免费观看| 这里只有视频精品| 在线成人国产| 国产欧美日本一区二区三区| 久久综合亚洲社区| 亚洲欧美一级二级三级| 亚洲精品免费电影| 久久综合久色欧美综合狠狠| 亚洲性夜色噜噜噜7777| 亚洲国产欧美精品| 国产亚洲一本大道中文在线| 欧美三级午夜理伦三级中视频| 久久综合久久美利坚合众国| 先锋影音一区二区三区| 一本色道久久综合亚洲精品婷婷 | 欧美凹凸一区二区三区视频| 亚洲综合精品四区| 亚洲毛片播放| 亚洲国产精品热久久| 国产色产综合产在线视频| 欧美婷婷在线| 欧美精品粉嫩高潮一区二区 | 国产精品一区免费观看| 欧美日韩一区二区免费在线观看|