FILE * log_master_open (int level) { FILE *f; char filename[BUFFERLEN]; char oldfilename[BUFFERLEN]; char *basedir; struct stat info; // fix compiler warning (void)level; // FIXME: use level variable if (log_on_screen()) { return stderr; } if ((basedir = getenv("DRQUEUE_LOGS")) == NULL) { fprintf (stderr,"Environment variable DRQUEUE_LOGS not set. Aborting...\n"); log_level_out_set(L_ONSCREEN); return stderr; } snprintf(filename,BUFFERLEN-1,"%s/master.log",basedir); // basic logrotation if ((stat(filename, &info) == 0) && (info.st_size > MAX_MASTER_LOG_SIZE)) { snprintf(oldfilename,BUFFERLEN-1,"%s/master.1.log",basedir); unlink(oldfilename); rename(filename, oldfilename); } #ifdef __LINUX if ((f = fopen (filename,"a")) == NULL) { perror ("log_master_open: Couldn't open file for writing"); fprintf (stderr,"So... logging on screen.\n"); log_level_out_set(L_ONSCREEN); return stderr; } #else if ((f = fopen (filename,"ab")) == NULL) { perror ("log_master_open: Couldn't open file for writing"); fprintf (stderr,"So... logging on screen.\n"); log_level_out_set(L_ONSCREEN); return stderr; } #endif return f; }
FILE * log_slave_open_computer (int level, char *name) { FILE *f; char filename[BUFFERLEN]; char oldfilename[BUFFERLEN]; char *basedir; struct stat info; // fix compiler warning (void)level; // FIXME: use level variable if (log_on_screen()) { return stderr; } if ((basedir = getenv("DRQUEUE_LOGS")) == NULL) { fprintf (stderr,"Environment variable DRQUEUE_LOGS not set. Logging on screen...\n"); log_level_out_set (L_ONSCREEN); return stderr; } snprintf(filename,BUFFERLEN-1,"%s/%s.log",basedir,name); // basic logrotation if ((stat(filename, &info) == 0) && (info.st_size > MAX_SLAVE_LOG_SIZE)) { snprintf(oldfilename,BUFFERLEN-1,"%s/%s.1.log",basedir,name); unlink(oldfilename); rename(filename, oldfilename); } if ((f = fopen (filename,"a")) == NULL) { perror ("log_slave_open_computer: Couldn't open file for writing"); fprintf (stderr,"So... logging on screen.\n"); log_level_out_set (L_ONSCREEN); return stderr; } return f; }
void slave_get_options (int *argc,char ***argv, int *force, struct slave_database *sdb) { int opt; char *hour,*min; while ((opt = getopt (*argc,*argv,"a:n:fl:c:ohv")) != -1) { switch (opt) { case 'a': sdb->limits.autoenable.flags |= AEF_ACTIVE; hour = optarg; if ((min = strchr (hour,':')) == NULL) { usage (); exit (1); } *min = '\0'; min++; sdb->limits.autoenable.h = atoi (hour) % 24; sdb->limits.autoenable.m = atoi (min) % 60; printf ("Autoenable time from command line: %02i:%02i\n",sdb->limits.autoenable.h,sdb->limits.autoenable.m); break; case 'n': sdb->limits.nmaxcpus = atoi (optarg); sdb->flags |= SDBF_SETMAXCPUS; break; case 'c': strncpy(sdb->conf,optarg,PATH_MAX-1); printf ("Reading config file from: '%s'\n",sdb->conf); break; case 'f': *force = 1; fprintf (stderr,"WARNING: Forcing usage of pre-existing shared memory (-f). Do not do this unless you really know what it means.\n"); break; case 'l': log_level_severity_set (atoi(optarg)); printf ("Logging level set to: %s\n",log_level_str(loglevel)); break; case 'o': log_level_out_set (L_ONSCREEN); printf ("Logging on screen.\n"); break; case 'v': show_version (*argv); exit (0); case '?': case 'h': usage(); exit (0); } } }
void log_auto (int level, char *fmt, ...) { // this will be the way to send log messages when no one is known // for sure. FILE *f_log = stderr; char time_buf[BUFFERLEN]; char job_buf[BUFFERLEN]; char task_buf[BUFFERLEN]; char computer_buf[BUFFERLEN]; char msg[MAXLOGLINELEN]; char bkpmsg[MAXLOGLINELEN]; char origmsg[MAXLOGLINELEN]; va_list ap; if (!log_level_dest(level)) return; if (log_on_screen()) { f_log = stderr; } else { switch (logtool) { case DRQ_LOG_TOOL_MASTER: f_log = log_master_open(level); break; case DRQ_LOG_TOOL_SLAVE_TASK: if (logger_task) { f_log = log_slave_open_task(level,logger_task); break; } case DRQ_LOG_TOOL_SLAVE: default: if (gethostname(computer_buf,BUFFERLEN) != -1) { f_log = log_slave_open_computer(level,computer_buf); } else { log_level_out_set(L_ONSCREEN); f_log = stderr; } } } va_start (ap,fmt); vsnprintf (origmsg,MAXLOGLINELEN,fmt,ap); va_end (ap); log_get_time_str (time_buf,BUFFERLEN); snprintf (bkpmsg,MAXLOGLINELEN,"%s :",time_buf); // Time and pid strcpy(msg,bkpmsg); snprintf (bkpmsg,MAXLOGLINELEN,"%s | %6s |",msg,log_level_str(level)); // Log level strcpy(msg,bkpmsg); if (logger_job) { log_get_job_str (job_buf,BUFFERLEN); snprintf (bkpmsg,MAXLOGLINELEN,"%s %s :",msg,job_buf); strcpy(msg,bkpmsg); } if (logger_computer) { log_get_computer_str (computer_buf,BUFFERLEN); snprintf (bkpmsg,MAXLOGLINELEN,"%s %s :",msg,computer_buf); strcpy(msg,bkpmsg); } if (logger_task) { log_get_task_str (task_buf,BUFFERLEN); snprintf (bkpmsg,MAXLOGLINELEN,"%s %s :",msg,task_buf); strcpy(msg,bkpmsg); } fprintf (f_log,"%s -> MSG: %s\n",msg,origmsg); if (fileno(f_log) != fileno(stderr)) fclose(f_log); }