linux下的日志编写

devtools/2024/9/23 4:31:37/

 1、日志初始化创建

 2、日志写入

 3、日志关闭

log.c

#include "log.h"static log_t LOG;//初始化日志文件,在当前目录创建日志文件
int log_init(char *pdirname)
{time_t t;struct tm *ptm = NULL;char filepath[64] = {0};int ret = 0;time(&t);ptm = localtime(&t);ret = access(pdirname, F_OK);if (0 != ret){mkdir(pdirname, 0777);}sprintf(filepath, "%s/log_%4d%02d%02d", pdirname, ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday);LOG.flog = fopen(filepath, "a");if (NULL == LOG.flog){fprintf(stderr, "logfile open faileed, can not record software information");return -1;}LOG.curtime = ptm;pthread_mutex_init(&LOG.lock, NULL);return 0;
}//写入日志文件
int log_write(LEVEL_T level,const char *pfile, const int line, const char *pfunc, const char *pstr, ...)
{time_t t;struct tm *ptm = NULL;char tmpinfo[1024] = {0};va_list pnext;pthread_mutex_lock(&LOG.lock);if (level < LOG.curlevel){pthread_mutex_unlock(&LOG.lock);return 0;}va_start(pnext, pstr);time(&t);ptm = localtime(&t);if (ptm->tm_year != LOG.curtime->tm_year | ptm->tm_mon != LOG.curtime->tm_mon | ptm->tm_mday != LOG.curtime->tm_mday){   pthread_mutex_unlock(&LOG.lock);log_deinit();log_init("LOG_FILE");pthread_mutex_lock(&LOG.lock);LOG.curtime = ptm;}sprintf(tmpinfo, "%s\n", pstr);fprintf(LOG.flog, "[%4d-%02d-%02d %02d-%02d-%02d] [%s %d %s] ", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec, pfile, line, pfunc);vfprintf(LOG.flog, tmpinfo, pnext);va_end(pnext);pthread_mutex_unlock(&LOG.lock);return 0;
}//销毁日志文件
int log_deinit(void)
{//关闭日志文件if (NULL != LOG.flog){pthread_mutex_lock(&LOG.lock);fclose(LOG.flog);LOG.flog = NULL;pthread_mutex_unlock(&LOG.lock);pthread_mutex_destroy(&LOG.lock);}return 0;
}//设置日志级别
void log_setlevel(LEVEL_T level)
{LOG.curlevel = level;return;
}

log.h

#ifndef __LOG_H__
#define __LOG_H__#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <unistd.h>
#include <stdarg.h>
#include <pthread.h>typedef struct LOG_DATE 
{int year;int mon;int day;
}DATE_T;typedef enum LOG_LEVEL
{LOG_MASSAGE,LOG_WORNING,LOG_ERROR,
}LEVEL_T;typedef struct log
{FILE *flog;LEVEL_T curlevel;struct tm *curtime;  pthread_mutex_t lock;
}log_t;extern int log_init(char *pdirname);
extern int log_write(LEVEL_T level,const char *pfile, const int line, const char *pfunc, const char *pstr, ...);
extern int log_deinit(void);#endif

main.c

#include "log.h"int main(void)
{int num = 11451;log_init("LOG_FILE");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "===================================================");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "             software log record systerm           ");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "===================================================");log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "hello world %d", num);log_write(LOG_MASSAGE, __FILE__,__LINE__,__func__, "hello world %d", num);log_deinit();return 0;
}

效果:


http://www.ppmy.cn/devtools/115812.html

相关文章

网络编程问题解答

TCP/IP是哪种模型的协议 TCP/IP 是一组通信协议的集合&#xff0c;它基于 TCP/IP 模型。TCP/IP 模型通常被认为是一种实用的网络通信模型&#xff0c;与 OSI 模型相比&#xff0c;TCP/IP 模型更加简洁和侧重于实际应用&#xff0c;被广泛应用于互联网和大多数计算机网络中。 T…

CertiK因发现Apple Vision Pro眼动追踪技术漏洞,第6次获苹果认可

​2024年9月20日&#xff0c;头部Web3.0安全机构CertiK自豪地宣布&#xff0c;CertiK的工程师因发现Apple Vision Pro MR&#xff08;混合现实&#xff09;头显设备中的关键漏洞而获得Apple公司认可&#xff0c;这已经是Apple公司第六次公开发布对CertiK的致谢&#xff0c;Cert…

24年 九月 刷题记录

1. leetcode997找到小镇的法官 小镇里有 n 个人&#xff0c;按从 1 到 n 的顺序编号。传言称&#xff0c;这些人中有一个暗地里是小镇法官。 如果小镇法官真的存在&#xff0c;那么&#xff1a; 小镇法官不会信任任何人。 每个人&#xff08;除了小镇法官&#xff09;都信任这…

Qt安卓开发连接手机调试(红米K60为例)

1.前置条件 本人默认您已经完成Qt安卓环境的配置&#xff0c;若还没配置请参考链接文章&#xff1a;【Qt】最详细教程&#xff0c;如何从零配置Qt Android安卓环境_qt_七夕先生-开放原子开发者工作坊。准备一台目前主流在用的手机&#xff0c;其实自己用的就行(只要你不是某些…

光控资本:沪指涨0.59%,酿酒板块大幅拉升,数字货币概念等活跃

19日早盘&#xff0c;两市首要指数全线拉升&#xff0c;深证成指、创业板指涨约1%&#xff1b;场内超4800股飘红。 截至午间收盘&#xff0c;沪指涨0.59%报2733.38点&#xff0c;深证成指涨1.25%&#xff0c;创业板指涨0.99%&#xff0c;两市估计成交4263亿元。 盘面上看&…

Selenium点击元素的方法

前言 点击方法在web自动化测试中经常用到&#xff0c;下面就来介绍一下selenium常用和不常用的点击方法&#xff1b; 1、常用方法 1.1、使用 click() 方法&#xff1a; 这是最简单和最常用的方法。通过选中要点击的元素&#xff0c;然后使用 click() 方法来触发点击事件。 …

Web后端服务平台解析漏洞与修复、文件包含漏洞详解

免责申明 本文仅是用于学习检测自己搭建的Web后端服务平台解析漏洞、文件包含漏洞的相关原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国…

最长上升子序列

给定一个长度为 NN 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式 第一行包含整数 NN。 第二行包含 NN 个整数&#xff0c;表示完整序列。 输出格式 输出一个整数&#xff0c;表示最大长度。 数据范围 1≤N≤10001≤N≤1000&#xff0c; −…