LINUX.ORG.RU

Serial logger

 ,


0

1

Суть такова: есть некоторая железка, которая умеет писать логи в уарт. Я хочу фиксировать время прихода строк для последующих околосервисных целей.

До недавнего времени мне хватало однострочника на баше:

cat /dev/ttyUSB0 | awk '{print strftime("%Y-%m-%d %H:%M:%S %z"), $0; }'

Вопрос: есть ли в природе сабж, который умеет расставлять временные метки прихода строк с точностью хотя бы до десятков миллисекунд?

★★★★★

скажу совершенно наугад:
настроить syslog-ng на формат с миллисекундами (The most important extensions of the original protocol endorsed by syslog-ng are:ISO 8601 timestamp with millisecond granularity) и заюзать logger

zolden ★★★★★
()

Даёшь нано!

#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <time.h>
#include <locale.h>
#include <stdint.h>

#define READ_BUF_SZ 1024

#define ELSZ(array) (sizeof(array) / sizeof(array[0]))

int main()
{
	wchar_t         buf[READ_BUF_SZ], *r;
	int             need_timestamp = 1;
	struct timespec cur_time;

	if (!setlocale(LC_ALL, ""))
		return EXIT_FAILURE;

	for (;;) {
		buf[ELSZ(buf) - 1] = 1;
		r = fgetws(buf, ELSZ(buf), stdin);
		if (!r)
			return EXIT_FAILURE;

		if (need_timestamp) {
			if (clock_gettime(CLOCK_REALTIME, &cur_time) == -1)
				return EXIT_FAILURE;
			if (wprintf(L"%ju.%09ju ", (uintmax_t) cur_time.tv_sec, (uintmax_t) cur_time.tv_nsec) == -1)
				return EXIT_FAILURE;
			need_timestamp = 0;
		}
		if (fputws(buf, stdout) == -1)
			return EXIT_FAILURE;
		if (fflush(stdout) == EOF)
			return EXIT_FAILURE;

		if (buf[ELSZ(buf) - 1] || (buf[ELSZ(buf) - 2] == L'\n'))
			need_timestamp = 1;
	}
	return EXIT_SUCCESS;
}
$ gcc -Wall -Wextra -std=c99 -o nanotimestamp -D_POSIX_C_SOURCE=199309L -lrt nanotimestamp.c

$ ./nanotimestamp </dev/ttyS0 >logfile

Безбажность не гарантирую.

// mironov_ivan

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.