aboutsummaryrefslogtreecommitdiffstats
path: root/lib/log.h
blob: 286113b355bc991ef55e5b3005ff630ad34e9065 (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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
/*-*-c++-*-
 * $Id$
 *
 * This file is part of plptools.
 *
 *  Copyright (C) 1999  Philip Proudman <philip.proudman@btinternet.com>
 *  Copyright (C) 1999-2001 Fritz Elfert <felfert@to.com>
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  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 General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 */
#ifndef _LOG_H_
#define _LOG_H_

#include <cstdio>
#include <iostream>

#include <syslog.h>

/**
 * A streambuffer, logging via syslog
 *
 * logbuf can be used, if you want to use syslog for
 * logging but don't want to change all your nice
 * C++-style output statements in your code.
 *
 * Here is an example showing the usage of logbuf:
 *
 * <PRE>
 *	openlog("myDaemon", LOG_CONS|LOG_PID, LOG_DAEMON);
 *	logbuf ebuf(LOG_ERR, 2);
 *	ostream lerr(&ebuf);
 *
 *	... some code ...
 *
 *	lerr << "Whoops, got an error" << endl;
 * </PRE>
 *
 * The second optional argument of the constructor can be used
 * to switch the output destination between syslog and some
 * file. If it is omitted or set to -1, logging can be switched on
 * or off. The initial state is on.
 */
class logbuf : public std::streambuf {
public:

    /**
    * Constructs a new instance.
    *
    * @param loglevel The log level for this instance.
    *   see syslog(3) for symbolic names to use.
    * @param fd An optional file descriptor to use
    *   if switched off.
    */
    logbuf(int loglevel, int fd = -1);

    /**
    * Switches loggin on or off.
    *
    * @param newstate The desired state.
    */
    void setOn(bool newstate) { _on = newstate; }

    /**
    * Modifies the loglevel of this instance.
    *
    * @param newlevel The new loglevel.
    */
    void setLevel(int newlevel) { _level = newlevel; }

    /**
    * Retrieve the current state.
    *
    * @returns The current state.
    */
    bool on() { return _on; }

    /**
    * Retrieves the current loglevel.
    *
    * @returns The current loglevel.
    */
    int level() { return _level; }

    /**
    * Called by the associated
    * ostream to write a character.
    * Stores the character in a buffer
    * and calls syslog(level, buffer)
    * whenever a LF is seen.
    */
    int overflow(int c = EOF);

private:

    /**
    * Pointer to next char in buffer.
    */
    char *ptr;

    /**
    * Current length of buffer.
    */
    unsigned int len;

    /**
    * The log level to use with syslog.
    */
    int _level;

    /**
    * File descriptor to use when switched off.
    * If this is -1, don't output anything.
    */
    int _fd;

    /**
    * Log flag.
    */
    bool _on;

    /**
    * The internal buffer for holding
    * messages.
    */
    char buf[1024];
};

#endif

/*
 * Local variables:
 * c-basic-offset: 4
 * End:
 */