#ifndef __SYS_LOGGING_H__
#define __SYS_LOGGING_H__
/******************************************************************************/
/* */
/* X r d S y s L o g g i n g . h h */
/* */
/*(c) 2016 by the Board of Trustees of the Leland Stanford, Jr., University */
/*Produced by Andrew Hanushevsky for Stanford University under contract */
/* DE-AC02-76-SFO0515 with the Deprtment of Energy */
/* */
/* This file is part of the XRootD software suite. */
/* */
/* XRootD is free software: you can redistribute it and/or modify it under */
/* the terms of the GNU Lesser General Public License as published by the */
/* Free Software Foundation, either version 3 of the License, or (at your */
/* option) any later version. */
/* */
/* XRootD 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 Lesser General Public */
/* License for more details. */
/* */
/* You should have received a copy of the GNU Lesser General Public License */
/* along with XRootD in a file called COPYING.LESSER (LGPL license) and file */
/* COPYING (GPL license). If not, see . */
/* */
/* The copyright holder's institutional names and contributor's names may not */
/* be used to endorse or promote products derived from this software without */
/* specific prior written permission of the institution or contributor. */
/******************************************************************************/
#include
#include
#include
#include
#include "XrdSys/XrdSysLogPI.hh"
#include "XrdSys/XrdSysPthread.hh"
//-----------------------------------------------------------------------------
//! XrdSysLogging is the object that is used to route messages to a plugin
//! and is used to configure the base logger. There is only one such object.
//-----------------------------------------------------------------------------
class XrdSysLogger;
class XrdSysLogging
{
public:
//-----------------------------------------------------------------------------
//! Constructor and destructor
//!
//-----------------------------------------------------------------------------
XrdSysLogging() {}
~XrdSysLogging() {}
//-----------------------------------------------------------------------------
//! Parameters to be passed to configure.
//-----------------------------------------------------------------------------
struct Parms
{const char *logfn; //!< -> log file name or nil if none.
XrdSysLogPI_t logpi; //!< -> log plugin object or nil if none
int bufsz; //!< size of message buffer, -1 default, or 0
int keepV; //!< log keep argument
bool hiRes; //!< log using high resolution timestamp
Parms() : logfn(0), logpi(0), bufsz(-1), keepV(0), hiRes(false) {}
~Parms() {}
};
//-----------------------------------------------------------------------------
//! Configure the logger object using the parameters above.
//!
//! @param logr Reference to the logger object.
//! @param parms Reference to the parameters.
//!
//! @return true if successful and false if log could not be configured.
//-----------------------------------------------------------------------------
static bool Configure(XrdSysLogger &logr, Parms &parms);
//-----------------------------------------------------------------------------
//! Forward a log message to a plugin.
//!
//! @param mtime The time the message was generated.
//! @param tID The thread ID that issued the message.
//! @param iov The vector describing what to forward.
//! @param iovcnt The number of elements in iov vector.
//!
//! @return false if the message needs to also be placed in a local log file.
//! true if all processing has completed.
//-----------------------------------------------------------------------------
static bool Forward(struct timeval mtime, unsigned long tID,
struct iovec *iov, int iovcnt);
private:
struct MsgBuff
{struct timeval msgtod; // time message was generated
unsigned long tID; // Thread ID issuing message
unsigned int next; // Offset to next message, 0 if none
unsigned short buffsz; // In doublewords (max is 512K-8)
short msglen; // Len of msg text (max 32K-1) if <0 ->lost msgs
// char msgtxt; // Text follows the message header
};
static const int msgOff = sizeof(MsgBuff);
static const int mbDwords = (sizeof(MsgBuff)+7)/8*8;
static const int maxMsgLen = SHRT_MAX;
static int CopyTrunc(char *mbuff, struct iovec *iov, int iovcnt);
static bool EMsg(XrdSysLogger &logr, const char *msg);
static MsgBuff *getMsg(char **msgTxt, bool cont);
static void *Send2PI(void *arg);
static pthread_t lpiTID;
static bool lclOut;
static bool rmtOut;
};
#endif