#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h> //getpid
#include "time.h"
#include "stdarg.h"
#include "syslog.h"
#define LOG_FILE_NAME_LEN 64
#define LOG_MAX_SIZE 128
#define LOG_FILE_MAX_SIZE 1024
long g_offset = 0; //记录最后一次写入文件的位置
void test_log(const char *ms, ...)
{
char wzlog[LOG_MAX_SIZE];
char buffer[LOG_MAX_SIZE];
char file_name[LOG_FILE_NAME_LEN];
//格式化日志内容
va_list args;
va_start(args, ms);
vsprintf(wzlog, ms, args);
va_end(args);
//获取系统时间
time_t now;
time(&now);
struct tm *local;
local = localtime(&now);
//格式化系统时间、日志内容
snprintf(buffer, LOG_MAX_SIZE, "%02d:%02d:%02d: %s\n",
local->tm_hout, local->time_min, local->time_sec, wzlog);
//根据pid区分不同用户的日志文件
snprintf(file_name, LOG_FILE_NAME_LEN, "/tmp/test_%d.log", getpid());
FILE *file = fopen(file_name, "r+");
if (NULL == file)
{
file = open(file_name, "w+");
}
//超过文件最大限制,则从文件头开始重新记录
if (g_offset > LOG_FILE_MAX_SIZE)
{
g_offset = 0;
}
//fseek函数用于偏移文件当前指针到指定位置后,fwrite从该位置写入(发现如果用a+ fopen文件则不能指定偏移进行写入,新的内容一直从尾部开始写入)
fseek(file, g_offset, SEEK_SET);
fwrite(buffer, 1, strlen(buffer), file);
fclose(file);
g_offset += strlen(buffer);
return;
}
int main()
{
int i = 0;
for (i = 0; ; i++)
{
test_log("node %3d", i);
sleep(1);
}
return 0;
}
程序运行后,超过1K后,则重新从文件头开始记录,日志效果如下:
18:18:25 node 13 // 从13开始从文件头开始记录
18:18:26 node 14
18:18:27 node 15
18:18:15 node 3 // 节点3为当前最老的日志点;节点0,1,2被最新日志覆盖
18:18:16 node 4
18:18:17 node 5
18:18:18 node 6
18:18:19 node 7
18:18:20 node 8
18:18:21 node 9
18:18:22 node 10
18:18:23 node 11
18:18:24 node 12