On Wed, Apr 7, 2010 at 6:11 PM, FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp> wrote: > - distributions save a syslog in different places. > > - only root can access to a syslog > > - when you run multiple collie daemons on the single host, it's > difficult to read a single log file. > > So this patch makes collie daemon use the own log file like: > > fujita at rose:~/git/sheepdog$ ./collie/collie /tmp/u/ > fujita at rose:~/git/sheepdog$ ls -l /tmp/u > total 12 > -rw-r--r-- 1 fujita fujita 1103 2010-04-07 18:09 collie.log > drwxr-x--- 2 fujita fujita 4096 2010-04-07 18:09 epoch > drwxr-x--- 2 fujita fujita 4096 2010-04-07 18:09 obj > > Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp> > --- > collie/collie.c | 15 ++++++++++----- > collie/store.c | 10 ++++++---- > include/logger.h | 3 ++- > lib/logger.c | 34 ++++++++++++++++++++++++++++++---- > 4 files changed, 48 insertions(+), 14 deletions(-) > > diff --git a/collie/collie.c b/collie/collie.c > index 8367487..eed948b 100644 > --- a/collie/collie.c > +++ b/collie/collie.c > @@ -18,6 +18,7 @@ > > #define EPOLL_SIZE 4096 > #define DEFAULT_OBJECT_DIR "/tmp" > +#define LOG_FILE_NAME "collie.log" > > static char program_name[] = "collie"; > > @@ -60,6 +61,7 @@ int main(int argc, char **argv) > char *dir = DEFAULT_OBJECT_DIR; > int is_daemon = 1; > int log_level = LOG_INFO; > + char path[PATH_MAX]; > > while ((ch = getopt_long(argc, argv, short_options, long_options, > &longindex)) >= 0) { > @@ -72,6 +74,7 @@ int main(int argc, char **argv) > break; > case 'l': > log_level = atoi(optarg); > + break; > case 'd': > /* removed soon. use loglevel instead */ > log_level = LOG_DEBUG; > @@ -88,18 +91,20 @@ int main(int argc, char **argv) > if (optind != argc) > dir = argv[optind]; > > - ret = log_init(program_name, LOG_SPACE_SIZE, is_daemon, log_level); > + snprintf(path, sizeof(path), "%s/" LOG_FILE_NAME, dir); > + > + ret = init_store(dir); > if (ret) > exit(1); > > - if (is_daemon && daemon(0, 0)) > + ret = log_init(program_name, LOG_SPACE_SIZE, is_daemon, log_level, path); > + if (ret) > exit(1); > > - ret = init_event(EPOLL_SIZE); > - if (ret) > + if (is_daemon && daemon(0, 0)) > exit(1); > > - ret = init_store(dir); > + ret = init_event(EPOLL_SIZE); > if (ret) > exit(1); > > diff --git a/collie/store.c b/collie/store.c > index b35bbf5..9de86e1 100644 > --- a/collie/store.c > +++ b/collie/store.c > @@ -1373,9 +1373,11 @@ int get_nodeid(uint64_t *nodeid) > return attr(epoch_path, ANAME_NODEID, nodeid, sizeof(*nodeid), 0); > } > > -static int init_base_path(char *d, int *new) > +int init_base_path(char *d) > { > - return init_path(d, new); > + int new = 0; > + > + return init_path(d, &new); > } > > #define OBJ_PATH "/obj/" > @@ -1473,9 +1475,9 @@ static int init_mnt_path(char *base_path) > > int init_store(char *d) > { > - int ret, new = 0; > + int ret; > > - ret = init_base_path(d, &new); > + ret = init_base_path(d); > if (ret) > return ret; > > diff --git a/include/logger.h b/include/logger.h > index 7fa4cf1..6b4a399 100644 > --- a/include/logger.h > +++ b/include/logger.h > @@ -55,9 +55,10 @@ struct logarea { > char *buff; > int semid; > union semun semarg; > + int fd; > }; > > -extern int log_init(char * progname, int size, int daemon, int level); > +extern int log_init(char * progname, int size, int daemon, int level, char *outfile); > extern void log_close (void); > extern void dump_logmsg (void *); > extern void log_write(int prio, const char *func, int line, const char *fmt, ...) > diff --git a/lib/logger.c b/lib/logger.c > index 41dc0af..e30b698 100644 > --- a/lib/logger.c > +++ b/lib/logger.c > @@ -26,6 +26,7 @@ > #include <syslog.h> > #include <signal.h> > #include <errno.h> > +#include <time.h> > #include <sys/shm.h> > #include <sys/ipc.h> > #include <sys/stat.h> > @@ -132,6 +133,8 @@ static int logarea_init (int size) > > static void free_logarea (void) > { > + if (la->fd >= 0) > + close(la->fd); > semctl(la->semid, 0, IPC_RMID, la->semarg); > shmdt(la->buff); > shmdt(la->start); > @@ -176,6 +179,18 @@ static int log_enqueue(int prio, const char *func, int line, const char *fmt, > } > > p = buff; > + > + if (la->fd != -1) { > + time_t t; > + struct tm *tmp; > + > + t = time(NULL); > + tmp = localtime(&t); > + > + strftime(p, MAX_MSG_SIZE, "%b %2d %I:%M:%S ", tmp); > + p += strlen(p); > + } > + > snprintf(p, MAX_MSG_SIZE, "%s(%d) ", func, line); > > p += strlen(p); > @@ -260,7 +275,10 @@ static void log_syslog (void * buff) > { > struct logmsg * msg = (struct logmsg *)buff; > > - syslog(msg->prio, "%s", (char *)&msg->str); > + if (la->fd >= 0) > + write(la->fd, (char *)&msg->str, strlen((char *)&msg->str)); > + else > + syslog(msg->prio, "%s", (char *)&msg->str); > } > > static void dolog(int prio, const char *func, int line, const char *fmt, va_list ap) > @@ -342,7 +360,7 @@ static void log_flush(void) > } > } > > -int log_init(char *program_name, int size, int daemon, int level) > +int log_init(char *program_name, int size, int daemon, int level, char *outfile) > { > log_level = level; > > @@ -356,8 +374,15 @@ int log_init(char *program_name, int size, int daemon, int level) > struct sigaction sa_new; > int fd; > > - openlog(log_name, 0, LOG_DAEMON); > - setlogmask (LOG_UPTO (LOG_DEBUG)); > + if (outfile) { > + fd = open(outfile, O_CREAT | O_RDWR | O_APPEND, 0644); > + if (fd < 0) > + syslog(LOG_ERR, "failed to open %s\n", outfile); > + } else { > + fd = -1; > + openlog(log_name, 0, LOG_DAEMON); > + setlogmask (LOG_UPTO (LOG_DEBUG)); > + } It seems that outfile is always non-NULL. How about removing all the syslog stuff? Thanks, Kazutaka Morita |