35 #include "XrdVersion.hh"
69 bool BadHdr(dbgHdr *dLine)
70 {
if (dLine->sep1 !=
' ' || dLine->colon1 !=
':' || dLine->colon2 !=
':')
73 if (dLine->theHH[0] <
'0' || dLine->theHH[0] >
'2'
74 || dLine->theHH[1] <
'0' || dLine->theHH[0] >
'3'
75 || dLine->theMM[0] <
'0' || dLine->theMM[0] >
'5'
76 || dLine->theMM[1] <
'0' || dLine->theMM[1] >
'9'
77 || dLine->theSS[0] <
'0' || dLine->theSS[0] >
'5'
78 || dLine->theSS[1] <
'0' || dLine->theSS[1] >
'9')
return true;
80 for (
int i = 0; i < 6; i++)
81 if (dLine->theDate[i] <
'0' || dLine->theDate[i] >
'9')
return true;
87 void *LoggingStdErr(
void *carg)
90 struct timeval seTime = {0,0};
93 seStream.
Attach(stdErr, 4096);
94 do {
if ((ioV.iov_base = seStream.
GetLine()))
95 {ioV.iov_len = strlen((
const char *)ioV.iov_base);
97 {
if (ioV.iov_len < (
int)
sizeof(dbgHdr)
98 || BadHdr((dbgHdr *)ioV.iov_base))
continue;
114 struct tmpstr {
char *arg;
char *arg2, *arg3;
115 tmpstr(
const char *str) : arg(strdup(str)),
117 ~tmpstr() {
if (arg) free(arg);
118 if (arg2) free(arg2);
119 if (arg3) free(arg3);
125 char *logPI = 0, *logFN = 0;
130 if (!strcmp(logInfo.
logArg,
"-"))
return true;
131 tmpstr opt(logInfo.
logArg);
136 {
char *parms = index(opt.arg,
',');
139 {
eDest.
Emsg(
"Config",
"Log plugin library not specified.");
145 opt.arg3 = strdup(parms); *parms = 0; parms = opt.arg3;
146 if ((pval = varVal(
",bsz=", parms, eol,
',')))
150 if (rc < 0)
return false;
151 if (bsz && bsz < 8192) bsz = 8192;
152 logParms.
bufsz =
static_cast<int>(bsz);
154 if ((pval = varVal(
",cse=", parms, eol,
',')))
157 if (rc < 0)
return false;
159 logFN = varVal(
",logfn=", parms, eol,
',');
161 }
else logFN = opt.arg;
167 {
if (*(logFN+1) ==
'\0')
168 {
eDest.
Emsg(
"Config",
"Logfile name not specified.");
171 logParms.
logfn = ++logFN;
173 else if (strcmp(logFN,
"-"))
176 logParms.
logfn = opt.arg2 = logFN;
178 else logParms.
logfn = logFN;
186 char **lpiArgs = configLPIArgs(logInfo.
xrdEnv, argc);
188 {
eDest.
Emsg(
"Config",
"Unable to find logging plugin object in",logPI);
192 if (!(logParms.
logpi = (*logPInit)(logInfo.
cfgFn, lpiArgs, argc)))
193 {
eDest.
Emsg(
"Config",
"Logging plugin initialization failed.");
204 {
eDest.
Emsg(
"Config",
"Log configuration failed.");
212 if (logFN && (logPI = rindex(logFN,
'/'))) *(logPI+1) =
'\0';
213 else logParms.
logfn =
"./";
219 if (logPI && !logFN && cseLvl)
221 int pipeFD[2], dupStdErr = XrdSysFD_Dup(STDERR_FILENO);
222 if (dupStdErr < 0 || XrdSysFD_Pipe(pipeFD) < 0
223 || XrdSysFD_Dup2(pipeFD[1], STDERR_FILENO) < 0)
224 {
eDest.
Emsg(
"Config",errno,
"creating a pipe to capture stderr.");
230 {XrdSysFD_Dup2(dupStdErr, STDERR_FILENO);
231 eDest.
Emsg(
"Config", errno,
"start stderr router");
232 close(pipeFD[0]);
close(dupStdErr);
return false;
248 char **XrdOucLogging::configLPIArgs(
XrdOucEnv *
envP,
int &argc)
250 static char theLPI[] = {
'l',
'o',
'g', 0};
251 static char *dfltArgv[] = {0, 0};
261 if (!lpiArgv || argc < 1)
263 dfltArgv[0] = theLPI;
277 char *XrdOucLogging::varVal(
const char *var,
char *line,
char *&eol,
char delim)
281 char *result = strstr(line, var);
282 if (!result)
return 0;
286 result += strlen(var);
288 else if ((eol = index(result, delim))) *eol = 0;
static XrdSysError eDest(0,"crypto_")
XrdSysLogPI_t(* XrdSysLogPInit_t)(const char *cfgn, char **argv, int argc)
long GetInt(const char *varname)
static int Export(const char *Var, const char *Val)
void * GetPtr(const char *varname)
static bool configLog(XrdSysError &eDest, configLogInfo &logInfo)
void * Resolve(const char *symbl, int mcnt=1)
void Unload(bool dodel=false)
int Attach(int FileDescriptor, int bsz=2047)
static char * subLogfn(XrdSysError &eDest, const char *inst, char *logfn)
static int a2i(XrdSysError &, const char *emsg, const char *item, int *val, int minv=-1, int maxv=-1)
static int a2sz(XrdSysError &, const char *emsg, const char *item, long long *val, long long minv=-1, long long maxv=-1)
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
XrdSysLogger * logger(XrdSysLogger *lp=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)
XrdVERSIONINFODEF(myVersion, cmsclient, XrdVNUMBER, XrdVERSION)
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