Imported Upstream version 0.3
[anytun.git] / src / log.h
1 /*
2  *  anytun
3  *
4  *  The secure anycast tunneling protocol (satp) defines a protocol used
5  *  for communication between any combination of unicast and anycast
6  *  tunnel endpoints.  It has less protocol overhead than IPSec in Tunnel
7  *  mode and allows tunneling of every ETHER TYPE protocol (e.g.
8  *  ethernet, ip, arp ...). satp directly includes cryptography and
9  *  message authentication based on the methodes used by SRTP.  It is
10  *  intended to deliver a generic, scaleable and secure solution for
11  *  tunneling and relaying of packets of any protocol.
12  *
13  *
14  *  Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl, 
15  *                          Christian Pointner <satp@wirdorange.org>
16  *
17  *  This file is part of Anytun.
18  *
19  *  Anytun is free software: you can redistribute it and/or modify
20  *  it under the terms of the GNU General Public License version 3 as
21  *  published by the Free Software Foundation.
22  *
23  *  Anytun is distributed in the hope that it will be useful,
24  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
25  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
26  *  GNU General Public License for more details.
27  *
28  *  You should have received a copy of the GNU General Public License
29  *  along with anytun.  If not, see <http://www.gnu.org/licenses/>.
30  */
31
32 #ifndef _LOG_H_
33 #define _LOG_H_
34
35 #include <string>
36 #include <sstream>
37
38 #include "logTargets.h"
39 #include "threadUtils.hpp"
40
41 class Log;
42
43 class LogStringBuilder 
44 {
45 public:
46   LogStringBuilder(LogStringBuilder const& src);
47   LogStringBuilder(Log& l, int p);
48   ~LogStringBuilder();
49
50   template<class T>
51   std::ostream& operator<<(T const& value) { return stream << value; }
52
53 private:
54   Log& log;
55   int prio;
56   std::stringstream stream;
57 };
58
59 class Log
60 {
61 public:
62   static const int PRIO_ERROR = 1;
63   static const int PRIO_WARNING = 2;
64   static const int PRIO_NOTICE = 3;
65   static const int PRIO_INFO = 4;
66   static const int PRIO_DEBUG = 5;
67
68   static std::string prioToString(int prio);
69
70   static Log& instance();
71
72   void addTarget(std::string conf);
73   void addTarget(LogTargetList::target_type_t type, int prio, std::string conf);
74   LogStringBuilder msg(int prio=PRIO_INFO) { return LogStringBuilder(*this, prio); }
75
76 private:
77   Log() {};
78   ~Log() {};
79   Log(const Log &l);
80   void operator=(const Log &l);
81
82   static Log* inst;
83   static Mutex instMutex;
84   class instanceCleaner {
85     public: ~instanceCleaner() {
86       if(Log::inst != 0)
87         delete Log::inst;
88     }
89   };
90   friend class instanceCleaner;
91
92   void log(std::string msg, int prio);
93
94   Mutex mutex;
95   friend class LogStringBuilder;
96
97   LogTargetList targets;
98 };
99
100 extern Log& cLog;
101
102 #endif