服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Linux|Centos|Ubuntu|系统进程|Fedora|注册表|Bios|Solaris|Windows7|Windows10|Windows11|windows server|

服务器之家 - 服务器系统 - Linux - linux下C语言实现写日志功能

linux下C语言实现写日志功能

2022-07-13 09:10zgs2014 Linux

这篇文章给大家分享了linux下C语言实现写日志的相关功能方法以及实例代码,有兴趣的朋友可以学习参考下。

先上程序,该程序经过测试能够很好的实现写日志要求

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*************************************************************************
  > File Name: log.c
  > Author:
 ************************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <stdarg.h>
#include <time.h>
#include <pthread.h>
 
int safe_asprintf(char **strp, const char *fmt, ...);
int safe_vasprintf(char **strp, const char *fmt, va_list ap);
void plog(const char *format, ...) ;
void pinfo(const char *format, ...) ;
 
#define DEBUG
 
#ifdef DEBUG
void plog(const char *format, ...);
void pinfo(const char *format, ...);
#define debug(fmt, args...) plog(fmt, ##args)
#else
#define debug(fmt, args...) do{}while(0)
#endif
 
static pthread_mutex_t fileMutex = PTHREAD_MUTEX_INITIALIZER;
 
int main(int argc, char *argv)
{
  return 0;
}
 
/*
 * safe_asprintf();
 */
int safe_asprintf(char **strp, const char *fmt, ...)
{
  va_list ap;
  int retval;
 
  va_start(ap, fmt);
  retval = safe_vasprintf(strp, fmt, ap);
  va_end(ap);
 
  return retval;
}
 
/*
 * safe_vasprintf();
 */
int safe_vasprintf(char **strp, const char *fmt, va_list ap)
{
  int retval;
 
  retval = vasprintf(strp, fmt, ap);
  if (retval == -1)
  {
    printf("Failed to vasprintf: %s. Bailing out\n", strerror(errno));
    return 1;
  }
  return retval;
}
 
/*
 * plog();
 */
void plog(const char *format, ...)
{
 
  pthread_mutex_lock(&fileMutex);
 
  FILE *fp = NULL;
  va_list vlist;
  char *fmt = NULL;
 
  // Open debug info output file.
  if (!(fp = fopen("log.txt", "a+"))) {
    pthread_mutex_unlock(&fileMutex);
    return;
  }
 
  va_start(vlist, format);
  safe_vasprintf(&fmt, format, vlist);
  va_end(vlist);
  if (!fmt) {
    pthread_mutex_unlock(&fileMutex);
    return;
  }
 
  time_t timep;
  struct tm *ptm = NULL;
  time(&timep);
  ptm = localtime(&timep);
  fprintf(fp, "[%04d-%02d-%02d-%02d-%02d-%02d] %s",
      ptm->tm_year + 1900,
      ptm->tm_mon + 1,
      ptm->tm_mday,
      ptm->tm_hour,
      ptm->tm_min,
      ptm->tm_sec,
      fmt);
 
  free(fmt);
  fsync(fileno(fp));
  fclose(fp);
 
  pthread_mutex_unlock(&fileMutex);
}
 
/*
 * pinfo();
 */
void pinfo(const char *format, ...)
{
  pthread_mutex_lock(&fileMutex);
 
  FILE *fp = NULL;
  va_list vlist;
  char *fmt = NULL;
 
  // Open debug info output file.
  if (!(fp = fopen("log.txt", "a+"))) {
    pthread_mutex_unlock(&fileMutex);
    return;
  }
 
  va_start(vlist, format);
  safe_vasprintf(&fmt, format, vlist);
  va_end(vlist);
  if (!fmt) {
    pthread_mutex_unlock(&fileMutex);
    return;
  }
 
  fprintf(fp, "%s", fmt);
 
  free(fmt);
  fsync(fileno(fp));
  fclose(fp);
 
  pthread_mutex_unlock(&fileMutex);
}

程序实现的日志格式为:

时间 + 空格 + 具体实现(自己的调试内容)

本段程序值得学习的地方:

  1. va_list 结构体的使用
  2. linux 的格式化输出字符串
  3. 文件操作过程中pthread_mutex锁的使用,以及他的优点
  4. linux DEBUG 的应用,方便调试

linux如何查看日志:

使用tail 命令可以实现日志的查询,以及其他功能,不了解的话,自行查资料解决。

对上面应用不明白的请自行查资料解决。

原文链接:https://blog.csdn.net/u013711616/article/details/52293447

延伸 · 阅读

精彩推荐
  • Linuxlinux中高并发socket最大连接数的优化详解

    linux中高并发socket最大连接数的优化详解

    这篇文章主要给大家介绍了关于linux中高并发socket最大连接数优化的相关资料,文中介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来...

    晓的技术博客8182021-12-29
  • Linuxlinux系统find命令之xargs使用实例分享

    linux系统find命令之xargs使用实例分享

    在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在...

    linux命令大全4852019-11-19
  • LinuxLinux文件编辑命令vi详细整理(总结)

    Linux文件编辑命令vi详细整理(总结)

    本篇文章主要介绍了Linux文件编辑命令详细整理(总结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    小宝鸽4862022-02-10
  • LinuxLinux使用userdel命令删除用户的方法

    Linux使用userdel命令删除用户的方法

    需要对系统用户账号进行定期管理,将不需要的用户及时删除,以免造成不必要的麻烦,删除用户账号需要使用到userdel命令,下面以图文的形式为大家介绍...

    服务器之家5912019-10-15
  • LinuxLinux系统找出大文件的方法

    Linux系统找出大文件的方法

    磁盘空间被耗尽的时候,免不了要清理一下,比如说/home目录太大,就可以使用下面命令看看到底是谁 ...

    Linux教程网4662020-03-21
  • LinuxLinux中的LVM详解

    Linux中的LVM详解

    这篇文章主要介绍了Linux中的LVM详解,本文讲解了什么是LVM、为什么使用LVM、小系统使用LVM的益处、大系统使用LVM的益处、相关名词解释、创建LVM等内容,需要...

    脚本之家3882019-10-08
  • LinuxLinux crontab 命令的使用

    Linux crontab 命令的使用

    这篇文章主要介绍了Linux crontab 命令的使用,帮助大家更好的理解和学习Linux系统,感兴趣的朋友可以了解下...

    Dabelv4992020-09-01
  • Linuxlinux 下怎样使用qq等聊天工具聊天

    linux 下怎样使用qq等聊天工具聊天

    windows是很好用的,原因就是他的用户体验性好,可随意用QQ、YY、阿里旺旺等多种聊天软件聊天,那么在 linux 系统中怎样进行聊天呢?其实在 linux 中,同样...

    linux教程网4072019-10-26