在编写服务器代码的时候,往往需要编写一个日志模块。日志系统可以存放一些服务器运行情况的相关数据,方便后面服务器出现bug时可以查看相关的问题。
日志系统的实现主要分为两个功能
1.获取当前的时间
2.将相关内容写入日志文件
获取当前时间
主要用到了以下函数及结构体
#include <time.h>
localtime - 将时间数值变换成本地时间,考虑到本地时区和夏令时标志
函数声明:
#include <time.h>
struct tm * localtime(const time_t *timer);
time - 获取计算机系统当前的日历时间(Calender Time)
处理日期时间的函数都是以本函数的返回值为基础进行运算
函数原型:
#include <time.h>
time_t time(time_t *calptr);
返回值:
成功:秒数,从1970-1-1,00:00:00
使用:
time_t now;
time(&now); // == now = time(NULL);
struct tm {
int tm_sec; //秒, 范围从0到59
int tm_min; //分, 范围从0到59
int tm_hour; //小时, 范围从0到23
int tm_mday; //一个月中的第几天,范围从1到31
int tm_mon; //月份, 范围从0到11
int tm_year; //自 1900起的年数
int tm_wday; //一周中的第几天,范围从0到6
int tm_yday; //一年中的第几天,范围从0到365
int tm_isdst; //夏令时
};
写入日志文件
先创建一个日志文件,这里我在当前目录下面创建了一个test.log。文件操作主要用到了以下函数
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
int open(const char* path,int flag,/*int mode*/);
//返回值:<0 出错
:>=0 成功
filename:打开的文件名(只给文件名,只会在当前目录下搜索)
flag:文件打开的方式:
读:O_RDONLY 写:O_WRONLY 读写:O_RDWR
追加:O_APPEND 创建:O_CREAT(只有文件不存在时,才会生效,创建一个新的文件)
mode:创建文件时,指定文件的权限 0nnn
int write(int fd,void *buf,size_t size);
fd:写入的对象(open打开的文件)
buf:写入数据的起始位置
size:写入数据的长度(字节)
返回值:出错 -1|已经写入的数据长度
int close(int fd);关闭打开的文件
fd:操作的文件返回值: -1出错
0成功
实验完整代码:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
int log(char* content)
{
//每记录一次要在末尾记录,所以这里运用了追加功能,用或运算
int fd = open("./test.log", O_WRONLY|O_APPEND);
if(fd == -1)
{
printf("open failure\n");
return -1;
}
struct tm * pTM;
time_t nSeconds;
char datetime[23];
time(&nSeconds);
pTM = localtime(&nSeconds);
/* 系统日期和时间,格式: yyyymmddHHMMSS */
sprintf(datetime, "[%04d-%02d-%02d %02d:%02d:%02d]",
pTM->tm_year + 1900, pTM->tm_mon + 1, pTM->tm_mday,
pTM->tm_hour, pTM->tm_min, pTM->tm_sec);
char log[1024];
sprintf(log, "%s %s\n", datetime, content);
int ret = write(fd, log, strlen(log));
if(ret == - -1)
{
printf("写入失败!");
return -1;
}
close(fd);
return 0;
}
int main()
{
char content[1024];
printf("please input content\n");
scanf("%s", content);
if(log("content") == -1)
printf("log failure\n!");
else
printf("log succeed!\n");
return 0;
}