]> git.ipfire.org Git - thirdparty/pdns.git/blame - pdns/logger.hh
Merge pull request #6412 from rgacogne/dnsdist-gnutls-memset
[thirdparty/pdns.git] / pdns / logger.hh
CommitLineData
12c86877 1/*
12471842
PL
2 * This file is part of PowerDNS or dnsdist.
3 * Copyright -- PowerDNS.COM B.V. and its contributors
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
8 *
9 * In addition, for the avoidance of any doubt, permission is granted to
10 * link this program with OpenSSL and to (re)distribute the binaries
11 * produced as the result of such linking.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21 */
7abbc40f 22#pragma once
12c86877
BH
23
24#include <string>
12c86877
BH
25#include <ctime>
26#include <iostream>
27#include <sstream>
76473b92 28#include <syslog.h>
f14ebffb 29#include <pthread.h>
12c86877 30
10f4eea8 31#include "namespaces.hh"
7abbc40f 32#include "dnsname.hh"
ded6b08d 33#include "iputils.hh"
12c86877
BH
34
35//! The Logger class can be used to log messages in various ways.
36class Logger
37{
38public:
12c86877
BH
39 Logger(const string &, int facility=LOG_DAEMON); //!< pass the identification you wish to appear in the log
40
41 //! The urgency of a log message
b34510a3
CH
42 enum Urgency {All=32767,Alert=LOG_ALERT, Critical=LOG_CRIT, Error=LOG_ERR, Warning=LOG_WARNING,
43 Notice=LOG_NOTICE,Info=LOG_INFO, Debug=LOG_DEBUG, None=-1};
12c86877 44
16276aa8
RK
45 /** Log a message.
46 \param msg Message you wish to log
47 \param u Urgency of the message you wish to log
12c86877 48 */
16276aa8 49 void log(const string &msg, Urgency u=Notice);
12c86877
BH
50
51 void setFacility(int f){d_facility=f;open();} //!< Choose logging facility
52 void setFlag(int f){flags|=f;open();} //!< set a syslog flag
53 void setName(const string &);
54
55 //! set lower limit of urgency needed for console display. Messages of this urgency, and higher, will be displayed
56 void toConsole(Urgency);
eefd15f9 57 void setLoglevel( Urgency );
12c86877 58
b6cfa948
PL
59 void disableSyslog(bool d) {
60 d_disableSyslog = d;
61 }
62
b18fa400
PL
63 void setTimestamps(bool t) {
64 d_timestamps = t;
65 }
66
12c86877
BH
67 //! Log to a file.
68 void toFile( const string & filename );
69
70 void resetFlags(){flags=0;open();} //!< zero the flags
71 /** Use this to stream to your log, like this:
72 \code
73 L<<"This is an informational message"<<endl; // logged at default loglevel (Info)
74 L<<Logger::Warning<<"Out of diskspace"<<endl; // Logged as a warning
75 L<<"This is an informational message"<<endl; // logged AGAIN at default loglevel (Info)
76 \endcode
77 */
7abbc40f 78 Logger& operator<<(const char *s);
12c86877
BH
79 Logger& operator<<(const string &s); //!< log a string
80 Logger& operator<<(int); //!< log an int
f1f85f12 81 Logger& operator<<(double); //!< log a double
ff181ffa 82 Logger& operator<<(unsigned int); //!< log an unsigned int
ac8a2021 83 Logger& operator<<(long); //!< log an unsigned int
96879e7d 84 Logger& operator<<(unsigned long); //!< log an unsigned int
1d5b3ce6 85 Logger& operator<<(unsigned long long); //!< log an unsigned 64 bit int
7abbc40f 86 Logger& operator<<(const DNSName&);
ded6b08d 87 Logger& operator<<(const ComboAddress&); //!< log an address
12c86877
BH
88 Logger& operator<<(Urgency); //!< set the urgency, << style
89
10f4eea8 90 Logger& operator<<(std::ostream & (&)(std::ostream &)); //!< this is to recognise the endl, and to commit the log
12c86877
BH
91
92private:
d1449e4d 93 struct PerThread
94 {
95 PerThread()
96 {
97 d_urgency=Info;
98 }
99 string d_output;
100 Urgency d_urgency;
101 };
102 static void initKey();
103 static void perThreadDestructor(void *);
104 PerThread* getPerThread();
12c86877 105 void open();
c0eb8971 106
12c86877
BH
107 string name;
108 int flags;
109 int d_facility;
eefd15f9 110 Urgency d_loglevel;
12c86877 111 Urgency consoleUrgency;
c0eb8971 112 bool opened;
b6cfa948 113 bool d_disableSyslog;
b18fa400 114 bool d_timestamps{true};
d1449e4d 115 static pthread_once_t s_once;
116 static pthread_key_t s_loggerKey;
12c86877
BH
117};
118
119extern Logger &theL(const string &pname="");
120
121#ifdef VERBOSELOG
122#define DLOG(x) x
123#else
cea46e92 124#define DLOG(x) ((void)0)
12c86877 125#endif