46 static const int buffOvhd = 8;
56 struct timeval todLost;
61 static const int syncBSZ = 8192;
64 pthread_t XrdSysLogging::lpiTID;
65 bool XrdSysLogging::lclOut =
false;
66 bool XrdSysLogging::rmtOut =
false;
85 {sprintf(eBuff,
"Error %d (%s) binding to log file %s.\n",
87 return EMsg(logr, eBuff);
94 if (!parms.
logpi) {lclOut =
true;
return true;}
95 piLogger= parms.
logpi;
109 int bsz = (parms.
bufsz < 0 ? 65536 : parms.
bufsz);
110 rc = posix_memalign((
void **)&buffOrg, getpagesize(), bsz);
111 if (rc != 0 || !buffOrg)
return EMsg(logr,
"Unable to allocate log buffer!\n");
113 buffBeg = buffOrg + buffOvhd;
114 buffEnd = buffOrg + bsz;
119 {sprintf(eBuff,
"Error %d (%s) starting LogPI handler.\n",
121 return EMsg(logr, eBuff);
134 int XrdSysLogging::CopyTrunc(
char *mbuff,
struct iovec *
iov,
int iovcnt)
137 int segLen, bLeft = syncBSZ - 1;
141 for (
int i = 0; i < iovcnt; i++)
142 {segLen =
iov[i].iov_len;
143 if (segLen >= bLeft) segLen = bLeft;
144 memcpy(mbP,
iov[i].iov_base, segLen);
145 mbP += segLen; bLeft -= segLen;
146 if (bLeft <= 0)
break;
159 bool XrdSysLogging::EMsg(
XrdSysLogger &logr,
const char *msg)
161 struct iovec
iov[] = {{0,0}, {(
char *)msg,0}};
163 iov[1].iov_len = strlen((
const char *)
iov[1].iov_base);
173 struct iovec *
iov,
int iovcnt)
176 char *fence, *freeMsg, *msgText;
177 int dwords, msgLen = 0;
182 for (
int i = 0; i < iovcnt; i++) msgLen +=
iov[i].iov_len;
187 {
char *mbP, mbuff[syncBSZ];
188 if (msgLen >= syncBSZ) msgLen = CopyTrunc(mbuff,
iov, iovcnt);
190 for (
int i = 0; i < iovcnt; i++)
191 {memcpy(mbP,
iov[i].iov_base,
iov[i].iov_len);
192 mbP +=
iov[i].iov_len;
196 (*piLogger)(mtime, tID, mbuff, msgLen);
206 if (msgLen > maxMsgLen)
217 dwords = msgLen+8 +
sizeof(MsgBuff);
218 if (numLost) dwords +=
sizeof(MsgBuff);
228 {freeMsg = lastMsg + ((MsgBuff *)lastMsg)->buffsz*8;
229 fence = (lastMsg >= pendMsg ? buffEnd : pendMsg);
240 if ((freeMsg + (dwords*8)) > fence)
251 {theMsg = (MsgBuff *)freeMsg;
252 theMsg->msgtod = mtime;
254 theMsg->buffsz = mbDwords;
255 theMsg->msglen = -numLost;
256 if (lastMsg) ((MsgBuff *)lastMsg)->next = freeMsg - buffOrg;
263 theMsg = (MsgBuff *)freeMsg;
264 theMsg->msgtod = mtime;
267 theMsg->buffsz = dwords;
268 theMsg->msglen = msgLen;
269 if (lastMsg) ((MsgBuff *)lastMsg)->next = freeMsg - buffOrg;
274 msgText = freeMsg + msgOff;
275 for (
int i = 0; i < iovcnt; i++)
276 {memcpy(msgText,
iov[i].iov_base,
iov[i].iov_len);
277 msgText +=
iov[i].iov_len;
286 if (doPost) pendMsg = freeMsg;
288 if (doPost) msgAlert.Post();
296 XrdSysLogging::MsgBuff *XrdSysLogging::getMsg(
char **msgTxt,
bool cont)
303 if (!pendMsg)
return 0;
310 {
if (((MsgBuff *)pendMsg)->next)
311 pendMsg = buffOrg + ((MsgBuff *)pendMsg)->next;
317 theMsg = (MsgBuff *)pendMsg;
318 *msgTxt = pendMsg + msgOff;
326 void *XrdSysLogging::Send2PI(
void *arg)
330 char *msgTxt, lstBuff[80];
338 while((theMsg = getMsg(&msgTxt, cont)))
339 {
if ((msgLen = theMsg->msglen) < 0)
341 msgLen = snprintf(lstBuff,
sizeof(lstBuff),
"%d message%s lost!",
342 n, (n == 1 ?
"" :
"s"));
345 (*piLogger)(theMsg->msgtod, theMsg->tID, msgTxt, msgLen);
const char * XrdSysE2T(int errcode)
void(* XrdSysLogPI_t)(struct timeval const &mtime, unsigned long tID, const char *msg, int mlen)
void setHiRes()
Set log file timstamp to high resolution (hh:mm:ss.uuuu).
void Put(int iovcnt, struct iovec *iov)
static void setForwarding(bool onoff)
Set call-out to logging plug-in on or off.
int Bind(const char *path, int lfh=0)
static bool Forward(struct timeval mtime, unsigned long tID, struct iovec *iov, int iovcnt)
static bool Configure(XrdSysLogger &logr, Parms &parms)
static int Run(pthread_t *, void *(*proc)(void *), void *arg, int opts=0, const char *desc=0)
Parameters to be passed to configure.
XrdSysLogPI_t logpi
-> log plugin object or nil if none
int keepV
log keep argument
const char * logfn
-> log file name or nil if none.
bool hiRes
log using high resolution timestamp
int bufsz
size of message buffer, -1 default, or 0