From 3ca12815f557e8512f203b480db9067417a58b69 Mon Sep 17 00:00:00 2001 From: Babak Farrokhi Date: Wed, 21 Oct 2015 18:04:46 +0330 Subject: [PATCH] - add timestamping support via log_tsprintf() --- logfile.c | 43 ++++++++++++++++++++++++++++++++++--------- logfile.h | 2 ++ logfile_test.c | 8 +++++--- 3 files changed, 41 insertions(+), 12 deletions(-) diff --git a/logfile.c b/logfile.c index 02bdf8e..84446c1 100644 --- a/logfile.c +++ b/logfile.c @@ -98,21 +98,46 @@ log_reopen(log_t **log) void log_printf(const log_t *log, const char *format,...) { + if (!log_isopen(log)) + return; + va_list args; char *message; + char *newline = "\n"; - /* - * todo: add timestamp and \n example: "Oct 21 13:46:35 %s\n" - */ + va_start(args, format); + vasprintf(&message, format, args); + va_end(args); - if (log_isopen(log)) { + write(log->fd, message, strnlen(message, MAX_MSG_SIZE)); + write(log->fd, newline, sizeof(*newline)); +} - va_start(args, format); - vasprintf(&message, format, args); - va_end(args); +void +log_tsprintf(const log_t *log, const char *format,...) +{ + if (!log_isopen(log)) + return; - write(log->fd, message, strnlen(message, MAX_MSG_SIZE)); - } + va_list args; + char *message; + char s_time[30]; + time_t now; + struct tm *ltime; + size_t tsize; + char *newline = "\n"; + + va_start(args, format); + vasprintf(&message, format, args); + va_end(args); + + now = time(NULL); + ltime = localtime(&now); + tsize = strftime(s_time, sizeof(s_time), "%Y-%m-%d %T %Z - ", ltime); + + write(log->fd, s_time, tsize); + write(log->fd, message, strnlen(message, MAX_MSG_SIZE)); + write(log->fd, newline, sizeof(*newline)); } bool diff --git a/logfile.h b/logfile.h index b867fcd..189e8a8 100644 --- a/logfile.h +++ b/logfile.h @@ -40,6 +40,7 @@ #include #include #include +#include #define LOGPATH "/var/log" #define MAX_MSG_SIZE 65536 @@ -58,5 +59,6 @@ bool log_isopen(const log_t *log); bool log_verify(const log_t *log); void log_reopen(log_t **log); void log_printf(const log_t *log, const char *format,...); +void log_tsprintf(const log_t *log, const char *format,...); #endif /* _LOGFILE_H */ diff --git a/logfile_test.c b/logfile_test.c index a70ff96..087862c 100644 --- a/logfile_test.c +++ b/logfile_test.c @@ -42,20 +42,22 @@ main(void) if ((lh = log_open("test.log", 0600)) == NULL) { err(EX_IOERR, "Cannot open log file"); } - if (!log_verify(lh)) err(errno, "Failed to verify integrity of log file"); - log_printf(lh, "opened file handle: %d , inode: %llu\n", lh->fd, lh->ino); + log_printf(lh, "opened file handle: %d , inode: %llu", lh->fd, lh->ino); printf("logfile: %s, handle: %d, inode: %llu, mode: %d\n", lh->path, lh->fd, lh->ino, lh->mode); log_reopen(&lh); if (!log_verify(lh)) err(errno, "Failed to verify integrity of reopened log file"); - log_printf(lh, "reopened file handle: %d , inode: %llu\n", lh->fd, lh->ino); + log_printf(lh, "reopened file handle: %d , inode: %llu", lh->fd, lh->ino); printf("logfile: %s, handle: %d, inode: %llu, mode: %d\n", lh->path, lh->fd, lh->ino, lh->mode); + for (int i = 1; i <= 4; i++) + log_tsprintf(lh, "This is a time stamped message %d", i); + log_close(lh); return 0;