记录Log

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

int get_line(FILE *fp)
{
	int line = 0;
	char buf[1024];
	
	//buf:....\n\0
	while(fgets(buf,sizeof(buf),fp) != NULL)
	{
		if(buf[strlen(buf) - 1] == '\n')
			line ++;
	}
	
	return line;
}

void do_log(FILE *fp)
{
	time_t tim;
	struct tm *ptm;
	int line = get_line(fp);

	while(1)
	{
		tim = time(NULL);
		ptm = localtime(&tim);
		
		fprintf(fp,"%d,%d-%d-%d  %d:%d:%d.\n",++line,ptm->tm_year + 1900,ptm->tm_mon + 1,\
				ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
		
		fflush(fp);
		sleep(1);

		printf("ok.\n");
	}

	return ;
}

//./a.out log.txt
int main(int argc, const char *argv[])
{
	FILE *fp;

	if(argc < 2)
	{
		fprintf(stderr,"Usage : %s argv[1].\n",argv[0]);
		return -1;
	}

	if((fp = fopen(argv[1],"a+")) == NULL)
	{
		fprintf(stderr,"Fail to fopen %s : %s.\n",argv[1],strerror(errno));
		return -1;
	}

	do_log(fp);

	fclose(fp);
	
	return 0;
}

记录时间日志 

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>

struct rtc_time{
	int tm_sec; //当前秒    
	int tm_min; //当前分钟    
	int tm_hour; //当前小时    
	int tm_mday; //当前在本月中的天,如11月1日,则为1    
	int tm_mon; //当前月,范围是0~11    
	int tm_year; //当前年和1900的差值,如2006年则为36    
};


int get_time()
{
    struct tm *get_tm;
    struct timeval get_tv;

    gettimeofday(&get_tv, NULL);
    get_tm = localtime(&get_tv.tv_sec);

    #if 0
    printf("%s \n", asctime(get_tm));
    #else
    printf("year %d mon %d mday %d hour %d min %d sec  %d \n",  get_tm->tm_year + 1900, get_tm->tm_mon + 1,
                                                                get_tm->tm_mday, get_tm->tm_hour,
                                                                get_tm->tm_min , get_tm->tm_sec);
    #endif

    return 0;
}


void split(char *src,const char *separator,char **dest,int *num)
{
    /*
        src 源字符串的首地址(buf的地址)
        separator 指定的分割字符
        dest 接收子字符串的数组
        num 分割后子字符串的个数
    */
     char *pNext;
     int count = 0;
     if (src == NULL || strlen(src) == 0) //如果传入的地址为空或长度为0,直接终止
        return;
     if (separator == NULL || strlen(separator) == 0) //如未指定分割的字符串,直接终止
        return;
     pNext = (char *)strtok(src,separator); //必须使用(char *)进行强制类型转换(虽然不写有的编译器中不会出现指针错误)
     while(pNext != NULL) {
          *dest++ = pNext;
          ++count;
         pNext = (char *)strtok(NULL,separator);  //必须使用(char *)进行强制类型转换
    }
    *num = count;
}

int time_service(char *buf)
{
	printf("buf:%s\n", buf);

	struct rtc_time tm; 
	struct tm _tm;  
	struct timeval tv;  
	time_t timep;  

	sscanf(buf, "%d:%d:%d:%d:%d:%d", &tm.tm_year,  
	&tm.tm_mon, &tm.tm_mday,&tm.tm_hour,  
	&tm.tm_min, &tm.tm_sec);

	_tm.tm_sec = tm.tm_sec+180;  
	_tm.tm_min = tm.tm_min;  
	_tm.tm_hour = tm.tm_hour;  
	_tm.tm_mday = tm.tm_mday;  
	_tm.tm_mon = tm.tm_mon - 1;  
	_tm.tm_year = tm.tm_year - 1900;  

	printf("y:%d m:%d d:%d h:%d m:%d s:%d\n", _tm.tm_year, _tm.tm_mon, _tm.tm_mday, _tm.tm_hour, _tm.tm_min, _tm.tm_sec);

	timep = mktime(&_tm);  
	tv.tv_sec = timep;  
	tv.tv_usec = 0;  
	if(settimeofday (&tv, (struct timezone *) 0) < 0)  
	{  
	   printf("Set system datatime error!/n");  
	   return -1;  
	}
	else
	{
		printf("settimeofday ok...\n");
	}

	get_time();

	return 0;
}

int get_line(FILE *fp, char *out_buf)
{
	int line = 0;
	char buf[1024];
	int len  = 0;
	
	//buf:....\n\0
	while(fgets(buf,sizeof(buf),fp) != NULL)
	{
		if(buf[strlen(buf) - 1] == '\n')
		{
			line ++;
		}
	}

	len = strlen(buf);
	
	int  i = 0;
	for(i = 0 ; i < len; i++)
	{
		printf("str=%c ",buf[i]);
		if (buf[i] == ':')
		{
		   printf("find it i:%d...\n",i);
		    memcpy(out_buf, buf+i+1, len-i-1);
		    break;
		}
	}

        printf("out_buf=%s\n", out_buf );


	return line;
}
 
void do_log(FILE *fp)
{
	char out_buf[1024]={0};
	time_t tim;
	struct tm *ptm;

	int line = get_line(fp, out_buf);
	printf("out_buf:%s\n",out_buf);
	
	time_service(out_buf);
 
	//while(1)
	{
		tim = time(NULL);
		ptm = localtime(&tim);
		
		fprintf(fp,"%d:%d:%d:%d:%d:%d:%d\n",++line,ptm->tm_year + 1900,ptm->tm_mon + 1,\
				ptm->tm_mday,ptm->tm_hour,ptm->tm_min,ptm->tm_sec);
		
		fflush(fp);
		usleep(10*100);
 
		printf("ok.\n");
	}
 
	return ;
}
 
//./a.out log.txt
int main(int argc, const char *argv[])
{
	get_time();
	FILE *fp;
 
	if(argc < 2)
	{
		fprintf(stderr,"Usage : %s argv[1].\n",argv[0]);
		return -1;
	}
 
	if((fp = fopen(argv[1],"a+")) == NULL)
	{
		fprintf(stderr,"Fail to fopen %s : %s.\n",argv[1],strerror(errno));
		return -1;
	}
 
	do_log(fp);
 
	fclose(fp);
	
	return 0;
}

 

记录日志是信息系统中不可或缺的一部分,它有助于监控系统运行状态、排查问题、审计操作行为等。根据不同的应用场景和技术栈,记录日志的方式也有所不同。以下是一些常见的日志记录方法和建议: ### 1. Windows 系统日志 Windows 操作系统提供了三种主要的日志类型:应用程序日志、系统日志和安全日志。这些日志可以记录与操作系统、应用程序和安全性相关的事件。例如,登录成功和失败的事件分别通过事件ID 4624和4625来标识[^1]。 ### 2. MySQL 存储过程中的日志记录 在MySQL中,可以通过创建存储过程并在其中使用日志表来记录特定操作的信息。例如,可以定义一个名为 `log_table_test` 的存储过程,该过程会在执行期间记录每次循环的计数,并最终查询出本次执行的日志记录。这种方式适用于需要在数据库层面对操作进行追踪的场景[^2]。 ### 3. 使用 Log4j 记录 Java 应用程序日志 对于Java应用程序,Log4j 是一个广泛使用的日志记录框架,它支持多种日志输出方式,包括控制台、文件等。通过配置 DailyRollingFileAppender,可以实现日志文件按照时间滚动,如每天、每周生成新的日志文件。此外,还可以设置日志级别(如 DEBUG、INFO、ERROR)来控制日志输出的详细程度[^3]。 ### 4. 日志级别详解 日志级别用于控制日志信息的详细程度,常见的级别包括 DEBUG、INFO、WARN、ERROR 和 FATAL。DEBUG 级别用于记录详细的调试信息,而 FATAL 级别则用于记录导致程序终止的严重错误。合理设置日志级别可以帮助开发者快速定位问题,同时减少不必要的日志输出[^4]。 ### 示例代码:使用 Python 记录日志 Python 标准库中的 `logging` 模块提供了一种灵活的日志记录机制。以下是一个简单的例子,展示如何配置日志记录器以将日志信息写入文件: ```python import logging # 配置日志记录logging.basicConfig(filename='app.log', filemode='w', level=logging.DEBUG) # 记录一条日志 logging.debug('这是一个调试级别的日志消息') ``` 这段代码首先配置了一个日志记录器,指定了日志文件名 `app.log`,文件模式为写入模式(`w`),并且设置了日志级别为 DEBUG。之后,它记录了一条调试级别的日志消息。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

静思心远

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值