某些翔山兄弟的代码真的让人难以忍受。写的烂不说,日志也是一塌糊涂,你就往文件里写一堆字符串,我特么哪里知道你是项目哪里打的。。。

真正规范的日志格式起码包含:

[精确到毫秒的时间(查看时间顺序)]-[线程id(多线程分析)]-[文件名:行数(没这个我看什么日志!翔兄自己写的只有自己看得懂吧呕..)]--日志内容

我劝写代码的各位善良一点,不按上述格式的日志都是耍流氓!

另外日志功能应当满足如下三点:

  1. 线程安全--基本的
  2. 控制台和文件同时输出--便于调试,无论是开发还是服务运行时。
  3. 自动按天以及进程名称创建日志文件以及实时追加写入
  4. 采用宏定义调用,使用方便,随时随地日志

下面附上代码:某些菜鸟们真的太菜,我直接把头文件也加上了,算良心了吧,直接运行就行,这都不懂我真没辙了。

/** 作者:李海龙*/
#ifndef XLFD_H
#define XLFD_H//suport c++
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/socket.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <regex.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <arpa/inet.h>
#include <sys/time.h>
#include <dirent.h>
#include <pthread.h>
//在ubuntu中需要加这个,不然会报错ubuntu RLIMIT_NOFILE undeclared --守护进程函数
#include <sys/resource.h>
#include <unistd.h>
#include <dirent.h>
#include <sys/syscall.h>//syscall(__NR_gettid)获取线程号所需
#include <sys/un.h>
#include <sys/ipc.h>
#include <netdb.h>
#include <stdio.h>
#include <assert.h>
#include <stdarg.h>
#include <fcntl.h>
#include <limits.h>//各种类型的上限
#include <errno.h>
#include <stddef.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include <assert.h>
#include <limits.h>
#include <float.h>
#include <signal.h>
#include <limits.h>
#include <iconv.h>
#include <poll.h>
#include <sys/ioctl.h>
#include <netinet/tcp.h>
#include <signal.h>
#include <sys/param.h>//全局变量,日志名称以及路径
char pcPathLog[512] = "xlfd.log";//默认当前目录,特殊需设置
//设置日志路径以及名称,如/opt/xlfd.log
//则会自动生成/opt/xlfd日期.log
void clib_initLog(const char *newpath) {
//    pcPathLog = newpath;strcpy(pcPathLog,newpath);
}/**名称:WriteHLOG*参数:file 文件名*     line 行数*/
int HLOGFun(const char *file, int line, const char *pchFormat, ...) {int iFd;                              /*文件描述符*/int iFd1;char arrchMsg[65535] = {0};       /*参数格式及参数*/char arrchBuf[65535] = {0};       /*写入参数前的格式信息*/char arrchRes[65535]={0};char *pchIndex;                        /*当前位置*/va_list args;                             /*参数列表*/struct tm struTm;time_t tmNow;                            /*当前时间*/char pcHLOGPath[2048];    /*日志路径*/memset(pcHLOGPath,0,sizeof(pcHLOGPath));strcpy(pcHLOGPath, pcPathLog);//    strcpy(pcHLOGPath,C_LOG_PATH);iFd1 = STDOUT_FILENO;pchIndex = strrchr(pcHLOGPath, '.');//根据当前日期写入日志文件if (pchIndex == NULL) {pchIndex = pcHLOGPath + strlen(pcHLOGPath);}memcpy(arrchBuf, pcHLOGPath, pchIndex - pcHLOGPath);time(&tmNow);memset(&struTm, 0, sizeof(struct tm));localtime_r(&tmNow, &struTm);strftime(arrchBuf + strlen(arrchBuf), 20, "%Y-%m-%d", &struTm);sprintf(arrchBuf + strlen(arrchBuf), "%s", pchIndex);//打开自定义的文件,如果文件打开失败,则退出if ((iFd = open(arrchBuf, O_RDWR | O_APPEND | O_CREAT, 0666)) == -1) {return -1;}//读取参数列表中的参数va_start(args, pchFormat);vsprintf(arrchMsg, pchFormat, args);va_end(args);//定义信息说明的格式,并写入缓存memset(arrchBuf, 0, sizeof(arrchBuf));//    sprintf(arrchBuf, "[");time(&tmNow);memset(&struTm, 0, sizeof(struct tm));localtime_r(&tmNow, &struTm);strftime(arrchBuf, 20, "[%T", &struTm);struct timeval tvt;gettimeofday(&tvt, NULL);sprintf(arrchBuf + strlen(arrchBuf), ".%03d", (int) ((double) tvt.tv_usec / 1000));//把file中的路径信息去掉,只保留文件名char strname[512];bzero(strname, 512);char strpathcp[1024];bzero(strpathcp, 1024);strcpy(strpathcp, file);char strpathcp2[1024];bzero(strpathcp2, 1024);strcpy(strpathcp2, file);int count = 0;char *psplit = strtok(strpathcp, "/");while (psplit != NULL) {count++;//        printf("split: %s\n",psplit);psplit = strtok(NULL, "/");}//    printf("count: %d\n",count);int count2 = 0;char *psplit2 = strtok(strpathcp2, "/");while (psplit2 != NULL) {count2++;//        printf("split2: %s\n",psplit2);if (count2 == count)strcpy(strname, psplit2);psplit2 = strtok(NULL, "/");}//    printf("filename: %s\n",strname);sprintf(arrchBuf + strlen(arrchBuf), "]-[tid:%5ld]-[%s:%d]", syscall(__NR_gettid), strname, line);sprintf(arrchRes, "%-20s", arrchBuf);//如果信息说明格式未写入成功,则直接写入参数列表,否则按照信息说明格式写入if (strlen(arrchRes) == 0)sprintf(arrchRes, "%s\n", arrchMsg);elsesprintf(arrchRes + strlen(arrchRes), " %s\n", arrchMsg);write(iFd, arrchRes, strlen(arrchRes));write(iFd1, arrchRes, strlen(arrchRes));//如果是自定义日志类型,则关闭文件描述符close(iFd);return 0;
}
#define HLOG_FUN_PREV      __FILE__,__LINE__               /*日志前缀*/
/*去掉xp的,注意参数宏* 使用方法HLOG("%s,%s",pch,pch);自由参数个数*/
#define HLOG(...) HLOGFun(HLOG_FUN_PREV,__VA_ARGS__)
int main(int argc, char *argv[])
{
//设置日志路径以及名称clib_initLog("/opt/xlfd.log");double fdata=3.12;int idata=3333;char arrchData[5]="xlfd";HLOG("这是一个浮点型数据:%f,一个整形数据:%d,一个字符串数据:%s",fdata,idata,arrchData);return 0;
}
#endif // XLFD_H

运行结果如图:(本人是linux下QT调试的)

Linux C语言规范日志功能相关推荐

  1. linux日志配置含义,Linux操作系统中的日志功能详解

    日志系统将我们系统运行的每一个状况信息都使用文字记录下来,这些信息有助我们观察系统运行过程中正常状态和系统运行错误时快速定位错误位置的途径等;下面学习啦小编主要概述一下Linux操作系统中的日志功能. ...

  2. c语言程序窗口后台持续监测,用c语言实现后台运行的、每隔30s检查一次的、带有日志功能的断网重新连接程序...

    /*这是一个后台运行的.每隔30s检查一次的.带有日志功能的断网重新连接程序. 要想使用它必须要配置好c语言环境,比如安装有mingw的codeblocks 实现的方式就是每隔一段时间就去ping一下 ...

  3. Linux 服务器程序规范、服务器日志、用户、进程间的关系

    文章目录 服务器程序规范 日志 rsyslogd 守护进程 syslog函数 openlog函数 setlogmask函数 closelog函数 用户 进程间的关系 进程组 会话 系统资源限制 改变工 ...

  4. c语言延时30s的程序,用c语言实现后台运行的、每隔30s检查一次的、带有日志功能的断网重新连接程序...

    /*这是一个后台运行的.每隔30s检查一次的.带有日志功能的断网重新连接程序. 要想使用它必须要配置好c语言环境,比如安装有mingw的codeblocks 实现的方式就是每隔一段时间就去ping一下 ...

  5. linux启用日志记录功能,Linux下启用Open vSwitch的日志功能以便调试和排障

    问题 我试着为我的Open vSwitch部署排障,鉴于此,我想要检查它的由内建日志机制生成的调试信息.我怎样才能启用Open vSwitch的日志功能,并且修改它的日志等级(如,修改成INFO/DE ...

  6. 【Linux Centos6/7 Oracle11g数据库开启归档日志功能】

    Linux Centos6/7 Oracle11g数据库开启归档日志功能 1.登录oracle用户权限 2.查询是否开启归档模式 3.需提前创建归档日志的目录 4.再依次执行如下命令 5.开启归档模式 ...

  7. 关闭linux日志功能后性能测试

    ext3去除日志功能命令 tune2fs -O ^has_journal /dev/sda1 去掉内部默认的日志功能 查看是否有日志功能 tune2fs -l /dev/hdb2 |grep 'has ...

  8. Linux九阴真经之九阴白骨爪残卷12(日志功能)

    一.事务日志 transaction log:事务型存储引擎自行管理和使用 在一个事务提交后还没有存到磁盘的情况下会记录到事务日志,这个时候如果系统断电,再次开机后会自动将已提交的事务重做(redo ...

  9. 【Mysql】Mysql开启日志功能--Linux环境

    Mysql日志开启 一.功能general log开启 前言 Mysql开启会影响数据库的性能,但是在等级保护中,则是必须开启Mysql日志审计的,general log日志记录的内容有:时间.用户. ...

最新文章

  1. 10.无重复字符的最长子串---使用滑动窗口方法和哈希表来解决
  2. php微信回复乱码,php版微信公众平台回复中文出现乱码问题的解决方法
  3. oracle时区参考表,ORACLE 时区
  4. 一道简单的python面试题-购物车
  5. linux 用户/用户组添加修改删除(ubuntu/centos)
  6. HTML与JS交换值
  7. Zookeeper学习笔记之 Zab协议(Zookeeper Atomic Broadcast)
  8. 在 Linux 命令行中使用和执行 PHP 代码(一)
  9. 简单php文件编写语法
  10. 下载的****.ts格式的视频在迅雷播放器中无法播放
  11. 谭浩强版本C语言课后习题第二章
  12. 苹果手机投屏器 及如何使用设置连接电脑投屏教程
  13. C语言 修改JPEG图片属性
  14. 国家气象站逐日数据据v3.0 提取转成SWAT所需要格式
  15. 骗术在升级,一定要注意
  16. python结果四舍五入保留两位小数_python中四舍五入的正确打开方式
  17. 30岁以后搞Android已经没有前途?复习指南
  18. 送给去IT培训机构的猿们的一些毒鸡汤
  19. 软件测试专业山东大学好考吗,去山大复试跪了,谈谈我的血泪史,以资后来人...
  20. World Locking Tools for Unity (三)原理部分

热门文章

  1. 奇虎360员工持股超过周鸿祎 1/3将成百万富翁
  2. python VTK(十三) ----图像边缘检测 梯度算子 sobel算子
  3. FTPClient实现ftp的上传和下载
  4. 金蝶云星空与钉钉对接集成客户查询连通更新表单数据(宜搭)(basic-(新环境)更新客户)
  5. U盘格式化及注意事项(Windows,Linux,Mac)
  6. ML .NET 猫狗图像分类
  7. 泯灭Web App可用性的七个开发错误
  8. 联合高德推AR实景导航,OPPO手机的又一差异化策略
  9. 代码随想录Day7| 454、383、15、18
  10. 使用python进行数据清洗及ols回归分析