summaryrefslogtreecommitdiff
path: root/util/log.h
blob: 4024f49be7c2afac572a2d3c0356b9bc5a2f81f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
// log.h

/**
*    Copyright (C) 2008 10gen Inc.
*
*    This program is free software: you can redistribute it and/or  modify
*    it under the terms of the GNU Affero General Public License, version 3,
*    as published by the Free Software Foundation.
*
*    This program is distributed in the hope that it will be useful,
*    but WITHOUT ANY WARRANTY; without even the implied warranty of
*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*    GNU Affero General Public License for more details.
*
*    You should have received a copy of the GNU Affero General Public License
*    along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#pragma once

namespace mongo {

class Nullstream {
public:
    Nullstream& operator<<(const char *) {
        return *this;
    }
    Nullstream& operator<<(int) {
        return *this;
    }
    Nullstream& operator<<(unsigned long) {
        return *this;
    }
    Nullstream& operator<<(unsigned) {
        return *this;
    }
    Nullstream& operator<<(double) {
        return *this;
    }
    Nullstream& operator<<(void *) {
        return *this;
    }
    Nullstream& operator<<(long long) {
        return *this;
    }
    Nullstream& operator<<(unsigned long long) {
        return *this;
    }
    Nullstream& operator<<(const string&) {
        return *this;
    }
    Nullstream& operator<< (ostream& ( *endl )(ostream&)) {
        return *this;
    }
    Nullstream& operator<< (ios_base& (*hex)(ios_base&)) {
        return *this;
    }
};
extern Nullstream nullstream;

#define LOGIT { boostlock lk(mutex); cout << x; return *this; }
class Logstream {
    static boost::mutex mutex;
public:
    void flush() {
        boostlock lk(mutex);
        cout.flush();
    }
    Logstream& operator<<(const char *x) LOGIT
    Logstream& operator<<(char x) LOGIT
    Logstream& operator<<(int x) LOGIT
    Logstream& operator<<(unsigned long x) LOGIT
    Logstream& operator<<(unsigned x) LOGIT
    Logstream& operator<<(double x) LOGIT
    Logstream& operator<<(void *x) LOGIT
    Logstream& operator<<(long long x) LOGIT
    Logstream& operator<<(unsigned long long x) LOGIT
    Logstream& operator<<(const string& x) LOGIT
    Logstream& operator<< (ostream& ( *_endl )(ostream&)) {
        boostlock lk(mutex);
        cout << _endl;
        return *this;
    }
    Logstream& operator<< (ios_base& (*_hex)(ios_base&)) {
        boostlock lk(mutex);
        cout << _hex;
        return *this;
    }
    Logstream& prolog(bool withNs = false) {
        char now[64];
        time_t_to_String(time(0), now);
        now[20] = 0;

        boostlock lk(mutex);
        cout << now;
        if ( withNs && database && curNs )
            cout << curNs << ' ';
        return *this;
    }
};
extern Logstream logstream;

inline Logstream& problem() {
    return logstream.prolog(true);
}
inline Logstream& log() {
    return logstream.prolog();
}

inline ostream& stdcout() {
    return cout;
}

#define cout logstream


} // namespace mongo