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:
*/
|