Syslog date format

Mel Flynn mel.flynn+fbsd.questions at mailing.thruhere.net
Mon Jul 27 08:22:17 UTC 2009


On Sunday 26 July 2009 21:20:23 Modulok wrote:

> One would think that ISO 8601 date strings would make more sense, in
> addition not being language dependent. But I guess that's out.

It isn't too hard to convert on the fly. The real problem is that syslog
dates do not contain a year and timezone. The taillog program below sig
therefore may lie about the generated date. Most notably a year is
non-optional in ISO 8601.
Anyway, taillog is basically tail(1), except it shows the following:
% sudo taillog -2 /var/log/cron
2009-07-27 00:11:00-0800 smoochies /usr/sbin/cron[25808]: (operator) CMD (/usr/libexec/save-entropy)
2009-07-27 00:15:00-0800 smoochies /usr/sbin/cron[25834]: (root) CMD (/usr/libexec/atrun)

-- 
Mel

# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	taillog/BSDmakefile
#	taillog/taillog.c
#
echo x - taillog/BSDmakefile
sed 's/^X//' >taillog/BSDmakefile << 'f307a85b0a9ff60c11589de765a71b95'
X# $Coar: utils/taillog/BSDmakefile,v 1.1 2009/07/27 07:58:48 mel Exp $
XPROG=taillog
XNO_MAN=yes
X
X.include <bsd.prog.mk>
f307a85b0a9ff60c11589de765a71b95
echo x - taillog/taillog.c
sed 's/^X//' >taillog/taillog.c << '4c238c819ad69dd9d8586db323e29997'
X/*
X * vim: ts=4 sw=4 fdm=marker tw=78 ai noet
X * Copyright (c) 2009 Mel Flynn
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms, with or without
X * modification, are permitted provided that the following conditions
X * are met:
X * 1. Redistributions of source code must retain the above copyright
X *    notice, this list of conditions and the following disclaimer.
X * 2. Redistributions in binary form must reproduce the above copyright
X *    notice, this list of conditions and the following disclaimer in the
X *    documentation and/or other materials provided with the distribution.
X *
X * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
X * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
X * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X * SUCH DAMAGE.
X *
X * Taillog: tail(1) helper that converts syslog date format to ISO-8601.
X */
X#include <sys/cdefs.h>
X__FBSDID("$Coar: utils/taillog/taillog.c,v 1.1 2009/07/27 07:58:48 mel Exp $");
X
X#include <sys/types.h>
X#include <sys/param.h>
X#include <sys/resource.h>
X#include <sys/time.h>
X#include <sys/wait.h>
X
X#include <stdio.h>
X#include <unistd.h>
X#include <string.h>
X#include <time.h>
X
X#include <sysexits.h>
X#include <err.h>
X
X#define TAIL "/usr/bin/tail"
X
Xstatic inline void init_tp(const struct tm *now, struct tm *tp);
X
Xint main(int argc, char **argv)
X{
X	pid_t pid;
X	int fildes[2], res;
X	struct tm *now;
X	time_t clock;
X
X	tzset();
X	clock = time(NULL);
X	now = localtime(&clock);
X
X	res = pipe(fildes);
X	if( (pid = fork()) == 0 ) /* Child */
X	{
X		close(fildes[0]);
X		if( dup2(fildes[1], STDOUT_FILENO) < 0 )
X			err(EX_OSERR, "dup2()");
X		argv[0] = strdup(TAIL);
X		if( (res = execv(TAIL, argv)) < 0 )
X			err(EX_OSERR, "Failed to run tail");
X	}
X	else if( pid > 0 ) /* Parent */
X	{
X		char buf[BUFSIZ];
X		FILE *in;
X
X		close(fildes[1]);
X		if( (in = fdopen(fildes[0], "r")) == NULL )
X			err(EX_OSERR, "fdopen()");
X
X		while( fgets(buf, BUFSIZ, in) != NULL )
X		{
X			struct tm tp;
X			size_t len = strlen(buf);
X			char *ptr, tbuf[32];
X
X			init_tp(now, &tp);
X			ptr = strptime(buf, "%b %e %T", &tp);
X			if( ptr == NULL )
X			{
X				warnx("Line does not start with syslog date");
X				printf("%s", buf);
X			}
X			else
X			{
X				if( strftime(tbuf, sizeof(tbuf), "%Y-%m-%d %H:%M:%S%z", &tp) == 0 )
X					err(EX_SOFTWARE, "Can't convert time");
X				res = printf("%s%s", tbuf, ptr);
X			}
X			// Read and print till end of line
X			while( buf[len-1] != '\n' )
X			{
X				if( fgets(buf, BUFSIZ, in) == NULL )
X					err(EX_OSERR, "Can't read line");
X				printf("%s", buf);
X				len = strlen(buf);
X			}
X		}
X		(void)waitpid(pid, &res, 0);
X		close(fildes[0]);
X	}
X	else
X		err(EX_OSERR, "Failed to fork");
X
X	return (0);
X}
X
Xstatic inline void init_tp(const struct tm *now, struct tm *tp)
X{
X	tp->tm_year = now->tm_year;
X	tp->tm_isdst = now->tm_isdst;
X	tp->tm_zone = (now->tm_zone == NULL) ? NULL : strdup(now->tm_zone);
X	tp->tm_gmtoff = now->tm_gmtoff;
X}
4c238c819ad69dd9d8586db323e29997
exit




More information about the freebsd-questions mailing list