/*******************************************************************************
Copyright (C), 2010-2012,SMT.
FileName:hdsclog.c
Author: 施锦峰
Date: 2012/03/1
Description: 日志记录功能实现文件
History:
* <author> <date> <desc>
* 施锦峰 2012/03/1 新建
*******************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
#include <sys/file.h>
#include <sys/errno.h>
#include <sys/syslog.h>
#include "log.h"
#define OK 0
#define ERROR -1
/*通用常量定义*/
#define PATH_SIZE 255 /*文件路径缓冲大小*/
/*目录相关常量定义*/
#define LOG_PATH "log" /*日志数据保存文件夹*/
/*日志文件名称定义*/
#define DEBUG_FILE "debug.log"
#define INFO_FILE "info.log"
#define WARN_FILE "warn.log"
#define ERROR_FILE "error.log"
/*错误消息定义*/
#define SYSLOG_NULL "%s-%s为NULL"
#define SYSLOG_SYSCALL "%s-%s:%s"
#define SYSLOG_MKLOGDIR "%s-创建日志目录失败"
#define SYSLOG_MKLOGFILE "%s-创建日志文件失败"
#define SYSLOG_GETTIME "%s-获取当前时间失败"
#define SYSLOG_WRFILE "%s-写入日志文件失败"
/*一条日志的最大容量为BUFFER_SIZE*4*/
#define BUFFER_SIZE 1024
/*日志文件最大容量基数*/
#define MAX_LOGFILE_SIZE 2147483647
static INT32 GetTimeStr(PSTR ts);
static INT32 MakeLogdir(PSTR dir, INT32 dir_size);
static INT32 MakeFilename(PSTR base_filename, PSTR new_filename);
static INT32 WriteToFile(INT32 level,CPSTR logposinfo,CPSTR msgfmt, va_list ap);
/*********************************************************************
Function: GetTimeStr
Description: 获取当前时间(YYYY/MM/DD HH24:MI:SS)
Input: ts : 保存当前时间的字符数组
Output: ts : 当前时间字符串
Return: OK:成功 ERROR:失败
Author: 施锦峰
Date: 2012-03-1
Others:
*********************************************************************/
static INT32 GetTimeStr(PSTR ts)
{
/*参数检查*/
if (NULL == ts)
{
syslog(LOG_ERR, SYSLOG_NULL, __FILE__,__func__, "ts");
return ERROR;
}
struct timeval t;/*时间变量*/
gettimeofday(&t, NULL);
struct tm * p=localtime(&t.tv_sec);/*时间结构体*/
sprintf(ts, "%04d/%02d/%02d %02d:%02d:%02d.%03d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min,
p->tm_sec,t.tv_usec / 1000);
return OK;
}
/*********************************************************************
Function: MakeLogdir
Description: 根据月份创建目录(目录格式为YYYYMM)
Input: dir : 保存目录的字符数组
* dir_size : 字符数组dir的大小
Output: dir : 创建好的目录字符串
Return: OK:成功 ERROR:失败
Author: 施锦峰
Date: 2012-03-1
Others:
*********************************************************************/
static INT32 MakeLogdir(PSTR dir, INT32 dir_size)
{
time_t timep;/*时间变量*/
struct tm *p;/*时间结构体*/
INT8 log_dir[PATH_SIZE + 1];/*日志目录*/
PSTR hdc_home="/home";/*HDC_HOME目录*/
/*参数检查*/
if (NULL == dir)
{
syslog(LOG_ERR, SYSLOG_NULL, __FILE__,__func__, "dir");
return ERROR;
}
memset(log_dir, 0, sizeof(log_dir));
//hdc_home = getenv("HDC_HOME");
if ((NULL == hdc_home) || (strlen(hdc_home) == 0))
{
syslog(LOG_ERR, SYSLOG_NULL, __FILE__,__func__, "hdc_home");
return ERROR;
}
time(&timep);
p = localtime(&timep);
/*生成日志根目录的绝对路径*/
snprintf(log_dir, PATH_SIZE, "%s/%s", hdc_home, LOG_PATH);
if (access(log_dir, F_OK) == ERROR)/*确定log_dir目录不存在*/
{
if (mkdir(log_dir, 0755) == ERROR)/*创建权限为0755的目录*/
{
syslog(LOG_ERR, SYSLOG_SYSCALL, __FILE__,__func__, "mkdir", strerror(errno));
return ERROR;
}
}
/*在日志根目录下根据年月生成日志目录*/
snprintf(dir, dir_size, "%s/%04d%02d", log_dir, 1900 + p->tm_year, 1 + p->tm_mon);
/*创建目录并将目录的所有者和权限设置成跟父目录相同*/
if (access(dir, F_OK) == ERROR)/*确定dir目录不存在*/
{
struct stat dirstat;/*log folder property*/
if (stat(log_dir, &dirstat) == ERROR)/*获取日志目录状态信息*/
{
syslog(LOG_ERR, SYSLOG_SYSCALL, __FILE__,__func__, "stat", strerror(errno));
return ERROR;
}
if (mkdir(dir, 0755) == ERROR)/*创建权限为0755的目录*/
{
syslog(LOG_ERR, SYSLOG_SYSCALL, __FILE__,__func__, "mkdir", strerror(errno));
return ERROR;
}
/*将dir指定文件的所有者变更为参数dirstat.st_uid代表的用户,而将该文件的组变更为参数st_gid组*/
if (chown(dir, dirstat.st_uid, dirstat.st_gid) == ERROR)
{
syslog(LOG_ERR, SYSLOG_SYSCALL, __FILE__,__func__, "chown", strerror(errno));
return ERROR;
}
}
return OK;
}
/*********************************************************************
Function: MakeFilename
Description: 生成日志文件名称(在标准文件名称后面加上当前日期YYYYMMDD)
Input: base_filename : 标准文件名称字符串
Output: new_filename : 创建好的文件名称(YYYYMMDD标准文件名)
Return: OK:成功 ERROR:失败
Author: 施锦峰
Date: 2012-03-1
Others:
*********************************************************************/
static INT32 MakeFilename(PSTR base_filename, PSTR new_filename)
{
time_t timep;/*时间变量*/
struct tm *p;/*时间结构体*/
/*参数检查*/
if (NULL == base_filename)
{
syslog(LOG_ERR, SYSLOG_NULL, __FILE__,__func__, "base_filename");
return ERROR;
}
if (NULL == new_filename)
{
syslog(LOG_ERR, SYSLOG_NULL, __FILE__,__func__, "new_filename");
return ERROR;
}
time(&timep);
p = localtime(&timep);
snprintf(new_filename, PATH_SIZE, "%04d%02d%02d%s", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, base_filename);
return OK;
}
/*********************************************************************
Function: WriteToFile
Description: 将日志内容写到文件
Input: level : 1:info 2:warn 3:error 4:debug
* logposinfo:日志定位信息
* msgfmt: 消息格式(支持printf里的所有格式%d,%s等)
* ap:参数列表,对应消息格式里的参数
Output: 无
Return: OK:成功 ERROR:失败
Author: 施锦峰
Date: 2012-03-1
Others:
*********************************************************************/
static INT32 WriteToFile(INT32 level, CPSTR logposinfo,CPSTR msgfmt, va_list ap)
{
PSTR tmp_path;/*日志文件路径临时变量*/
INT8 pathname[PATH_SIZE + 1];/*日志文件全路径(包括文件名)*/
INT8 ts[24];/*当前时间字符串*/
INT8 log_dir[PATH_SIZE + 1];/*日志目录*/
INT8 filename[PATH_SIZE + 1];/*日志文件名称*/
INT32 fd;/*日志文件的文件描述符*/
INT8 buff[BUFFER_SIZE * 4 + 1];/*日志内容缓冲*/
INT32 nSize;/*日志内容的大小*/
INT32 offset; /*输出缓冲区的偏移量*/
/***************************
* 1:info
* 2:warn
* 3:error
* 4:debug
****************************/
switch (level)
{
case LEVEL_INFO:
tmp_path = INFO_FILE;
break;
case LEVEL_WARN:
tmp_path = WARN_FILE;
break;
case LEVEL_ERR:
tmp_path = ERROR_FILE;
break;
case LEVEL_DEBUG:
tmp_path = DEBUG_FILE;
break;
default:
tmp_path = NULL;
break;
}
if (NULL == tmp_path)
{
syslog(LOG_ERR, SYSLOG_NULL, __FILE__,__func__, "tmp_path");
return ERROR;
}
/*参数检查*/
if ((NULL == msgfmt) || (strlen(msgfmt) == 0))
{
syslog(LOG_ERR, SYSLOG_NULL, __FILE__,__func__, "msgfmt");
return ERROR;
}
memset(pathname, 0, sizeof(pathname));
memset(log_dir, 0, sizeof(log_dir));
memset(filename, 0, sizeof(filename));
memset(ts, 0, sizeof(ts));
memset(buff, 0, sizeof(buff));
/*创建日志目录*/
if (MakeLogdir(log_dir, PATH_SIZE) == ERROR)
{
syslog(LOG_ERR, SYSLOG_MKLOGDIR, __FILE__,__func__);
return ERROR;
}
/*生成文件名称*/
if (MakeFilename(tmp_path, filename) == ERROR)
{
syslog(LOG_ERR, SYSLOG_MKLOGFILE, __FILE__,__func__);
return ERROR;
}
snprintf(pathname,

gdxf1228
- 粉丝: 0
最新资源
- PHP音乐交流论坛的设计与实现毕业设计-(含源程序).doc
- 基于 Java 开发的数据采集管理系统 采用 Java 技术实现的数据采集系统 运用 Java 语言开发的数据采集系统 基于 Java 平台构建的数据采集系统 使用 Java 技术构建的数据采集系统
- 信息化建设实施实施方案.doc
- 机械制造附其自动化专业毕业设计.doc
- 运用网络技术改革物理教学模式.docx
- 探索C++20:从入门到精通
- Author-Paper-Citation数据集
- 作者 - 论文 - 引文关联关系数据集
- 作者 - 论文 - 引文关联数据集信息汇总
- SpringBoot2.X整合redis连接lettuce增强版本,支持多数据库切换,主从集群,哨兵
- 基于多算法与多数据集的中文自然语言处理情感分析
- 爱回收平台数据采集项目
- 创建美丽的Java富客户端应用程序
- 网络公开可用数据集资源索引汇总目录
- 爱回收平台相关数据采集工作项目
- 定时系统的正式建模与分析:FORMATS 2018会议精选
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


