[Sheepdog] [PATCH] collie: stop using syslog

FUJITA Tomonori fujita.tomonori at lab.ntt.co.jp
Wed Apr 7 11:11:48 CEST 2010


- 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));
+		}
 
 		if (logarea_init(size)) {
 			syslog(LOG_ERR, "failed to initialize the logger\n");
@@ -365,6 +390,7 @@ int log_init(char *program_name, int size, int daemon, int level)
 		}
 
 		la->active = 1;
+		la->fd = fd;
 		pid = fork();
 		if (pid < 0) {
 			syslog(LOG_ERR, "fail to fork the logger\n");
-- 
1.7.0




More information about the sheepdog mailing list