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

socketref,再見!高德

https://github.com/adoggie

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

常用鏈接

留言簿(54)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

本人一直使用的日志類,支持3種輸出方式(windows窗體,udp,常規文件),并格式化輸出:
  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){        //需要發送時發現 
 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);    //達到指定時間循環到文件頭部        
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 放屁阿狗 閱讀(3874) 評論(4)  編輯 收藏 引用 所屬分類: unix/linux/solaris/sco-unix/novell 、視頻監控

Feedback

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

另外,WindowWriter不提供一個hWnd作為參數的ctor,真是奇怪。  回復  更多評論
  

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

不錯。  回復  更多評論
  

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

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产日韩一区在线| 国产午夜一区二区三区| 欧美色欧美亚洲高清在线视频| 国产精品乱人伦一区二区| 亚洲人成网在线播放| 久久久水蜜桃| 亚洲欧美另类在线| 国产精品久久久久久久9999 | 国内久久婷婷综合| 亚洲欧美文学| 亚洲精品五月天| 欧美—级a级欧美特级ar全黄| 在线播放国产一区中文字幕剧情欧美 | 久久深夜福利| 精品盗摄一区二区三区| 久久久综合网站| 久久精品视频网| 在线观看亚洲视频| 蜜桃久久精品一区二区| 久久影院午夜片一区| 亚洲国产mv| 亚洲激情欧美| 欧美91福利在线观看| 亚洲人久久久| 99国产精品一区| 国产精品青草综合久久久久99| 国产日韩一区| 99精品视频免费在线观看| 亚洲全黄一级网站| 欧美色欧美亚洲另类二区| 欧美亚洲一区三区| 久久久久成人精品| 亚洲免费观看| 亚洲影院在线观看| 在线观看的日韩av| 日韩午夜精品视频| 国产香蕉97碰碰久久人人| 欧美成黄导航| 欧美视频在线观看| 久久免费国产| 欧美精品色网| 久久成人精品| 欧美精品www在线观看| 性欧美video另类hd性玩具| 久久精品成人一区二区三区蜜臀| 亚洲人成高清| 午夜精品久久久久久久久| 亚洲黄网站在线观看| 亚洲校园激情| 亚洲国产欧美日韩精品| 亚洲视频大全| 亚洲福利在线观看| 亚洲香蕉视频| 亚洲精品国产欧美| 欧美一区二区三区四区高清| 亚洲精品看片| 欧美专区福利在线| 宅男66日本亚洲欧美视频 | 国产精品三级视频| 欧美高清视频| 国产一区二区三区久久久久久久久| 亚洲激情在线观看| 国自产拍偷拍福利精品免费一| 亚洲欧洲一区二区天堂久久| 国产欧美一区二区三区国产幕精品 | av成人免费在线观看| 久久成人免费网| 亚洲在线成人| 欧美成人综合网站| 久久天天躁夜夜躁狠狠躁2022| 欧美日韩成人综合在线一区二区| 美女日韩欧美| 国内揄拍国内精品久久 | 国内精品免费午夜毛片| 99视频精品| 亚洲三级免费电影| 免费欧美高清视频| 欧美成人一区二区| 国产一区二区高清不卡| 亚洲一区视频在线观看视频| 一本一本久久a久久精品综合妖精| 久久人人爽人人爽| 久久综合色影院| 国产视频一区在线观看| 亚洲一区二区3| 亚洲欧美日韩中文视频| 国产精品激情偷乱一区二区∴| 黄色日韩精品| 国产日韩欧美精品一区| 国产精品免费小视频| 欧美激情一区二区三区在线视频观看| 久久久亚洲高清| 欧美黄色一区| 午夜日韩av| 欧美波霸影院| 亚洲欧美制服另类日韩| 另类图片国产| 亚洲欧美成人一区二区在线电影| 欧美一区二区观看视频| 91久久亚洲| 午夜精品美女久久久久av福利| 亚洲国产精品第一区二区| 在线亚洲一区观看| 亚洲精品123区| 欧美国产在线观看| 国产精品青草久久| 亚洲精品黄网在线观看| 国产日韩欧美麻豆| 91久久精品国产| 国内精品写真在线观看| 99在线视频精品| 亚洲韩日在线| 欧美综合二区| 亚洲亚洲精品三区日韩精品在线视频| 欧美中文字幕| 午夜精品久久久久久久蜜桃app| 老司机aⅴ在线精品导航| 欧美一区高清| 国产精品激情| 亚洲乱码国产乱码精品精天堂 | 亚洲精品乱码久久久久久| 国产一区二区三区免费不卡| 亚洲私人影院| 亚洲视频图片小说| 欧美紧缚bdsm在线视频| 欧美综合国产精品久久丁香| 欧美午夜电影在线| 日韩亚洲国产欧美| 日韩视频二区| 欧美激情a∨在线视频播放| 免费观看在线综合| 韩国av一区二区| 亚洲欧美一区二区精品久久久| 亚洲香蕉视频| 国产精品国产成人国产三级| 夜色激情一区二区| 亚洲午夜激情| 国产精品久久久久久久久久直播| 日韩亚洲在线观看| 亚洲校园激情| 国产精品高潮久久| 亚洲无亚洲人成网站77777| 亚洲自拍偷拍网址| 国产精品久久一卡二卡| 亚洲一区二区三区成人在线视频精品| 亚洲视频在线播放| 欧美激情欧美激情在线五月| 欧美成人一品| 国语自产精品视频在线看一大j8 | 夜夜狂射影院欧美极品| 亚洲无人区一区| 国产精品亚洲成人| 亚洲专区免费| 久久久久国产精品厨房| 亚洲夫妻自拍| 欧美日韩不卡合集视频| 一区二区三区精品国产| 欧美在线视频观看免费网站| 国内成人精品一区| 免费在线播放第一区高清av| 亚洲欧洲另类国产综合| 亚洲一级一区| 国产专区欧美精品| 久久综合伊人77777麻豆| 亚洲激情黄色| 午夜久久久久| 亚洲国产精品va在看黑人| 欧美日韩久久精品| 欧美一区二区三区精品电影| 欧美激情欧美激情在线五月| 亚洲一区在线观看免费观看电影高清| 国产欧美一区二区精品秋霞影院 | 国产伦精品一区二区三区高清版| 欧美中文字幕视频在线观看| 亚洲精品1区2区| 久久九九久久九九| 99精品欧美一区二区三区| 国产伦精品一区二区三区视频孕妇| 玖玖玖国产精品| 亚洲在线日韩| 亚洲精品国产精品国自产观看 | 日韩视频在线观看| 久久免费国产| 亚洲欧美三级在线| 亚洲精品美女91| 国产欧美日韩专区发布| 欧美精品日韩| 久久久久免费| 亚洲欧美日韩精品久久亚洲区| 亚洲国产精品视频| 久久九九精品| 欧美一区二区女人| 在线亚洲国产精品网站| 亚洲高清一区二| 国产视频一区在线| 国产精品香蕉在线观看| 国产精品99免视看9| 欧美另类极品videosbest最新版本| 午夜欧美大尺度福利影院在线看| 日韩午夜高潮|