1 #ifndef _msg_logger_h_
2 #define _msg_logger_h_
3 
4 #include "atomic_types.h"
5 #include "AmThread.h"
6 #include "cstring.h"
7 
8 #include <set>
9 #include <string>
10 using std::set;
11 using std::string;
12 
13 
14 struct sockaddr_storage;
15 
16 class msg_logger
17   : public atomic_ref_cnt
18 {
19 public:
msg_logger()20   msg_logger() {}
~msg_logger()21   virtual ~msg_logger() {}
22   virtual int log(const char* buf, int len,
23 		  sockaddr_storage* src_ip,
24 		  sockaddr_storage* dst_ip,
25 		  cstring method, int reply_code=0)=0;
26 };
27 
28 class exclusive_file;
29 
30 class file_msg_logger
31   : public msg_logger
32 {
33 protected:
34   exclusive_file* excl_fp;
35 
36   int write(const void *buf, int len);
37   int writev(const struct iovec *iov, int iovcnt);
38 
39   virtual int write_file_header() = 0;
40 
41 public:
file_msg_logger()42   file_msg_logger() : excl_fp(NULL) {}
43   ~file_msg_logger();
44 
45   int open(const char* filename);
46   int log(const char* buf, int len,
47 	  sockaddr_storage* src_ip,
48 	  sockaddr_storage* dst_ip,
49 	  cstring method, int reply_code=0)=0;
50 };
51 
52 class cf_msg_logger
53   : public file_msg_logger
54 {
55   std::set<string> known_destinations;
56 
57   int write_src_dst(const string& obj);
58 
59 protected:
write_file_header()60   int write_file_header() { return 0; }
61 
62 public:
63   int log(const char* buf, int len,
64 	  sockaddr_storage* src_ip,
65 	  sockaddr_storage* dst_ip,
66 	  cstring method, int reply_code=0);
67 };
68 
69 
70 #endif
71