自定义log日志输出到文件中保存

程序调试日志,可以 通过printf直接输出到屏幕上面进行调试。在默写特定的情况下面,可以将日志保存到文件中,后期进行查阅调试。

log.h

//log.h
#ifndef _ITCAST_LOG_H_
#define _ITCAST_LOG_H_

/*
#define IC_NO_LOG_LEVEL			0
#define IC_DEBUG_LEVEL			1
#define IC_INFO_LEVEL			2
#define IC_WARNING_LEVEL		3
#define IC_ERROR_LEVEL			4;
*/

/************************************************************************/
/*
const char *file:文件名称
int line:文件行号
int level:错误级别
0 -- 没有日志
1 -- debug级别
2 -- info级别
3 -- warning级别
4 -- err级别
int status:错误码
const char *fmt:可变参数
*/
/************************************************************************/
//实际使用的Level
extern int  LogLevel[5];
void ITCAST_LOG(const char *file, int line, int level, int status, const char *fmt, ...);

#endif

log.c

//log.c
#define _CRT_SECURE_NO_WARNINGS
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdarg.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "ItcastLog.h"

#define ITCAST_DEBUG_FILE_	"socketclient.log"
#define ITCAST_MAX_STRING_LEN 		10240

//Level类别
#define IC_NO_LOG_LEVEL			0
#define IC_DEBUG_LEVEL			1
#define IC_INFO_LEVEL			2
#define IC_WARNING_LEVEL		3
#define IC_ERROR_LEVEL			4

int  LogLevel[5] = { IC_NO_LOG_LEVEL, IC_DEBUG_LEVEL, IC_INFO_LEVEL, IC_WARNING_LEVEL, IC_ERROR_LEVEL };

//Level的名称
char ICLevelName[5][10] = { "NOLOG", "DEBUG", "INFO", "WARNING", "ERROR" };

static int ITCAST_Error_GetCurTime(char* strTime)
{
	struct tm*		tmTime = NULL;
	size_t			timeLen = 0;
	time_t			tTime = 0;

	tTime = time(NULL);
	tmTime = localtime(&tTime);
	//timeLen = strftime(strTime, 33, "%Y(Y)%m(M)%d(D)%H(H)%M(M)%S(S)", tmTime);
	timeLen = strftime(strTime, 33, "%Y.%m.%d %H:%M:%S", tmTime);

	return timeLen;
}

static int ITCAST_Error_OpenFile(int* pf)
{
	char	fileName[1024];

	memset(fileName, 0, sizeof(fileName));
#ifdef WIN32
	sprintf(fileName, "c:\\debuglog\\%s", ITCAST_DEBUG_FILE_);//log文件路径
#else
	sprintf(fileName, "%s/log/%s", getenv("HOME"), ITCAST_DEBUG_FILE_);
#endif

	*pf = open(fileName, O_WRONLY | O_CREAT | O_APPEND, 0666);
	if (*pf < 0)
	{
		return -1;
	}

	return 0;
}

static void ITCAST_Error_Core(const char *file, int line, int level, int status, const char *fmt, va_list args)
{
	char str[ITCAST_MAX_STRING_LEN];
	int	 strLen = 0;
	char tmpStr[64];
	int	 tmpStrLen = 0;
	int  pf = 0;

	//初始化
	memset(str, 0, ITCAST_MAX_STRING_LEN);
	memset(tmpStr, 0, 64);

	//加入LOG时间
	tmpStrLen = ITCAST_Error_GetCurTime(tmpStr);
	tmpStrLen = sprintf(str, "[%s] ", tmpStr);
	strLen = tmpStrLen;

	//加入LOG等级
	tmpStrLen = sprintf(str + strLen, "[%s] ", ICLevelName[level]);
	strLen += tmpStrLen;

	//加入LOG状态
	if (status != 0)
	{
		tmpStrLen = sprintf(str + strLen, "[ERRNO is %d] ", status);
	}
	else
	{
		tmpStrLen = sprintf(str + strLen, "[SUCCESS] ");
	}
	strLen += tmpStrLen;

	//加入LOG信息
	tmpStrLen = vsprintf(str + strLen, fmt, args);
	strLen += tmpStrLen;

	//加入LOG发生文件
	tmpStrLen = sprintf(str + strLen, " [%s]", file);
	strLen += tmpStrLen;

	//加入LOG发生行数
	tmpStrLen = sprintf(str + strLen, " [%d]\n", line);
	strLen += tmpStrLen;

	//打开LOG文件
	if (ITCAST_Error_OpenFile(&pf))
	{
		return;
	}

	//写入LOG文件
	write(pf, str, strLen);
	//IC_Log_Error_WriteFile(str);

	//关闭文件
	close(pf);

	return;
}

void ITCAST_LOG(const char *file, int line, int level, int status, const char *fmt, ...)
{
	va_list args;

	//判断是否需要写LOG
	//	if(level!=IC_DEBUG_LEVEL && level!=IC_INFO_LEVEL && level!=IC_WARNING_LEVEL && level!=IC_ERROR_LEVEL)
	if (level == IC_NO_LOG_LEVEL)
	{
		return;
	}

	//调用核心的写LOG函数
	va_start(args, fmt);
	ITCAST_Error_Core(file, line, level, status, fmt, args);
	va_end(args);

	return;
}

void main()
{
	int rv = -3;
	ITCAST_LOG(__FILE__, __LINE__, LogLevel[4], rv, "func cltSocketRev2: (buflen == NULL) [%d]", rv);
	system("pause");
}
时间: 2024-10-31 11:41:23

自定义log日志输出到文件中保存的相关文章

linux中如何将top的结果输出到文件中保存

我们在使用top命令的时候,为了便于检查日志文件,往往需要将top的信息输出到一个文件中,进行保存,这样就能清楚的知道进程的使用情况啦!命令如下: #top -d 2 -n 3 -b > test.txt 可以把top的结果每隔2秒,打印3次,这样后面页的进程也能够看见了 示例: [root@localhost /]# top -d 2 -n 3 -b > test.txt&http://www.aliyun.com/zixun/aggregation/37954.html"

linux c语言 使用system echo把变量输出到文件中

问题描述 linux c语言 使用system echo把变量输出到文件中 #include #include #include int main(void) { char *url = "asdfasdfasdf"; system("echo $url > /home/ylk/Desktop/1.txt"); printf(" url=%s ", url); return 0; } 结果不能把字符串写到1.txt中,怎么修改可以写进去呢?

android-在文件中保存图像的 byte 数组

问题描述 在文件中保存图像的 byte 数组 我使用下面的代码来获取一个 URL 文件的缩略图. MediaMetadataRetriever mmr = new MediaMetadataRetriever();mmr.setDataSource(URL);byte[] image = mmr.getEmbeddedPicture(); 我获得了缩略图的 byte 数组,然后我想把它保存为一个图像文件.如何实现? 解决方案 /** * 将图片写入到磁盘 * * @param img 图片数据流

将Linux下编译的warning警告信息输出到文件中[整理笔记]

Linux中,脚本语言环境中,即你用make xxx即其他一些普通linux命令,比如ls,find等,不同的数字,代表不同的含义: 数字 含义 标准叫法0 标准输入  stdin = standard input1 标准输出  stdout = standard output2 标准错误输出  stderr = standard error 而系统默认的stdin,stdout,stderr,都是屏幕,所以,当你执行命令,比如make,后,所输出的信息,都是可以在屏幕上看到的.所以,想要将对应

tomcat 和 jboss access log 日志输出详解

工作中nginx+jboss/tomcat反向代理集成,想打开后端jboss的access log, 配置在:/home/admin/wdetail/conf/tomcat-server.xml 开启日志将下面内容的注释去掉:            <valve classname="org.apache.catalina.valves.AccessLogValve" <="" div="" style="word-wrap

Tomcat控制台日志输出到文件

startup.bat中修改 call "%EXECUTABLE%" start %CMD_LINE_ARGS% 为 call "%EXECUTABLE%" run %CMD_LINE_ARGS%  (>> ..\logs\detailLog.%DATE:~0,10%.log )   这样控制台就不会输出日志文件了,让catalina.bat去决定日志输出在哪里吧 在catalina.bat中 寻找以%ACTION%结尾的四处,每处%ACTION%后面添

man 输出的帮助信息输出到文件中

man  iptables |col -b >man.text

Log4j不同模块输出到不同的文件中_java

1.实现目标 不同业务的日志信息需要打印到不同的文件中,每天或者每个小时生成一个文件.如,注册的信息打印到register.log,每天凌晨生成一个register-年月日.log文件, 登录信息的日志打印到一个login.log文件中,login-年月日.log. 2.maven配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.or

Nginx学习之自定义访问日志

写在开始 日志的重要性不言而喻,一般来说我们开发过程中会为每个项目定义自己的日志格式以及存储路径. 就我们普通的JAVAWEB项目来说,重要的日志一般输出并存放在Tomcat的log目录下,并区分日志输出级别.用于区分,查阅并统计相关日志信息. 当然,这不是重点,重点是很多公司,对于日志的重要性似乎并不是那么重视,当然这可能跟平台本身有一定的关系. 日志配置 其实分析Nginx日志,可以得到很多有用的数据,响应耗时的url.请求时间,各个时间段的请求量,并发量.配合使用ELK日志系统可以很好的呈