1ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe#include <unistd.h>
2ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe#include <fcntl.h>
3ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe#include <string.h>
4ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe#include <stdarg.h>
5e46d809110bd4ad2980ca64931b683673444454bJens Axboe#include <syslog.h>
63c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
7ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe#include "fio.h"
83c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
9e46d809110bd4ad2980ca64931b683673444454bJens Axboeint log_valist(const char *str, va_list args)
10e46d809110bd4ad2980ca64931b683673444454bJens Axboe{
11734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe	char buffer[1024];
12734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe	size_t len;
13734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe
14734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe	len = vsnprintf(buffer, sizeof(buffer), str, args);
1598ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn	len = min(len, sizeof(buffer) - 1);
16734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe
1703a0825286c82d79b8d489faf33a76d50713474bJens Axboe	if (is_backend)
1803a0825286c82d79b8d489faf33a76d50713474bJens Axboe		len = fio_server_text_output(FIO_LOG_INFO, buffer, len);
19734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe	if (log_syslog)
20734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe		syslog(LOG_INFO, "%s", buffer);
21734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe	else
22734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe		len = fwrite(buffer, len, 1, f_out);
23734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe
24734f38cb03e03390cddfd2d31cdbbd3f3d7f9e7fJens Axboe	return len;
25e46d809110bd4ad2980ca64931b683673444454bJens Axboe}
26e46d809110bd4ad2980ca64931b683673444454bJens Axboe
2713755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboeint log_local_buf(const char *buf, size_t len)
2813755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe{
2913755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe	if (log_syslog)
3013755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe		syslog(LOG_INFO, "%s", buf);
3113755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe	else
3213755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe		len = fwrite(buf, len, 1, f_out);
3313755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe
3413755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe	return len;
3513755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe}
3613755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe
37ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboeint log_info(const char *format, ...)
383c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe{
39ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	char buffer[1024];
40ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	va_list args;
41ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	size_t len;
423c39a379542fd819dbc5cf6daf59380911c39141Jens Axboe
43ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	va_start(args, format);
44ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	len = vsnprintf(buffer, sizeof(buffer), format, args);
45ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	va_end(args);
4698ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn	len = min(len, sizeof(buffer) - 1);
47f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
48ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	if (is_backend)
49084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe		return fio_server_text_output(FIO_LOG_INFO, buffer, len);
5013755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe	else if (log_syslog) {
5113755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe		syslog(LOG_INFO, "%s", buffer);
5213755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe		return len;
5313755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe	} else
54ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe		return fwrite(buffer, len, 1, f_out);
55f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe}
56f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
57fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fuint log_info_flush(void)
58fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fu{
59fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fu	if (is_backend || log_syslog)
60fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fu		return 0;
61fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fu
62fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fu	return fflush(f_out);
63fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fu}
64fdd5f15f8231e8c91c4deff22e630a34addd0fefVincent Kang Fu
65ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboeint log_err(const char *format, ...)
66fb71fbd73027a2d6202be9b9b1480bb845ea52dfJens Axboe{
67ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	char buffer[1024];
68ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	va_list args;
69ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	size_t len;
70f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe
71ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	va_start(args, format);
72ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	len = vsnprintf(buffer, sizeof(buffer), format, args);
73ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	va_end(args);
7498ffb8f3ecebed9984d1744f142eb8be10c14dbdKen Raeburn	len = min(len, sizeof(buffer) - 1);
75fb71fbd73027a2d6202be9b9b1480bb845ea52dfJens Axboe
76ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe	if (is_backend)
77084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe		return fio_server_text_output(FIO_LOG_ERR, buffer, len);
7813755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe	else if (log_syslog) {
7913755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe		syslog(LOG_INFO, "%s", buffer);
8013755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe		return len;
8113755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboe	} else {
821f39e5556fc0418ac6d1bd8531a91c94836a6350Jens Axboe		if (f_err != stderr) {
831f39e5556fc0418ac6d1bd8531a91c94836a6350Jens Axboe			int fio_unused ret;
841f39e5556fc0418ac6d1bd8531a91c94836a6350Jens Axboe
851f39e5556fc0418ac6d1bd8531a91c94836a6350Jens Axboe			ret = fwrite(buffer, len, 1, stderr);
861f39e5556fc0418ac6d1bd8531a91c94836a6350Jens Axboe		}
87fb71fbd73027a2d6202be9b9b1480bb845ea52dfJens Axboe
88ac9b9101f1ef57965d6ffd51f143274a1eb665efJens Axboe		return fwrite(buffer, len, 1, f_err);
89f29b25a370598d387e539c3dcae126274c6cbf4dJens Axboe	}
90e3cedca76d9fc104eb4f6f869606fb5bf4c0d59cJens Axboe}
913ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe
923ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboeconst char *log_get_level(int level)
933ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe{
943ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe	static const char *levels[] = { "Unknown", "Debug", "Info", "Error",
953ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe						"Unknown" };
963ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe
973ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe	if (level >= FIO_LOG_NR)
983ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe		level = FIO_LOG_NR;
993ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe
1003ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe	return levels[level];
1013ad04399c576bb7935b9a7b8c07d5acf373a7bc4Jens Axboe}
102