-
Notifications
You must be signed in to change notification settings - Fork 1
/
klog.c
211 lines (176 loc) · 4.89 KB
/
klog.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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
//
// klog.c
// mylib
//
// Created by bikang on 17/10/27.
// Copyright (c) 2017年 bikang. All rights reserved.
//
#include "klog.h"
//定义基本的结构
typedef struct Klog{
const char* logpath;//存储地址
int fd;//文件句柄
ULONG flag;//日志发送的地方
char splite_char[5];//分隔符
short is_show_line;//是否显示行+文件名,默认不显示
}KLogger;
//初始化一个数据
static KLogger KL = {"",-1,LOG_DEBUG,PUT_STD_OUT};
//根据条件初始化日志
int logInit(const char *str_path,ULONG flag){
if (str_path == NULL){
return KLOG_FAILD;
}
KL.flag = flag;
KL.logpath = str_path;
if((flag & PUT_SFILE) == PUT_SFILE){
KL.fd = open(str_path, O_WRONLY|O_CREAT|O_APPEND,S_IRWXU|S_IRWXO);
if(KL.fd < 0){
return KLOG_FAILD;
}
}
if ((KL.flag & PUT_SYSLOG) == PUT_SYSLOG) {
//记录pid 立即打开连接, 记录用户日志
openlog(KL.logpath, LOG_PID | LOG_NDELAY, LOG_USER);
}
int len = LOG_DEFAULT_SPLITE_LEN;
memset(KL.splite_char, '\0', len);
KL.splite_char[0] = LOG_DEFAULT_SPLITE;
KL.is_show_line = 0;
return KLOG_SUCESS;
}
//重新设置路径
int setLogerPath(const char *str_path){
logClose();
if (str_path && strlen(str_path) > 0){
return logInit(str_path,KL.flag);
}
return KLOG_FAILD;
}
//设置保存的类型
void setLogerSaveType(ULONG flag){
KL.flag = flag;
}
//添加一个种类型
void addLogerSaveType(ULONG flag){
KL.flag = KL.flag| flag;
}
//移除一种类型
void removeLogerSaveType(ULONG flag){
KL.flag = KL.flag & ~flag;
}
//获取flag
ULONG getLogerFlag(){
return KL.flag;
}
//设置切分符号
void setSpliteData(const char *split){
int len = LOG_DEFAULT_SPLITE_LEN;
if(strlen(split)> 0 && strlen(split) < len){
strcpy(KL.splite_char, split);
}
}
//设置是否显示文件信息
void setShowFile(int is_show){
KL.is_show_line = is_show;
}
int logClose(){
if(KL.fd != -1 && close(KL.fd) < 0){
//todo add something
return KLOG_FAILD;
}
if ((KL.flag & PUT_SYSLOG) == PUT_SYSLOG) {
closelog();
}
KL.fd = -1;
return KLOG_SUCESS;
}
//获取当前时间
char *getCurrentTime(){
struct tm *ptr;
int len = SHOW_TIME_LEN;
time_t tl;
char *buf = (char*)malloc(sizeof(char) * len);
tl = time(NULL);
ptr = localtime(&tl);
buf[strftime(buf, len , "%Y-%m-%d %H:%M:%S", ptr)]='\0';
return buf;
}
/**
处理日志:
1 输出时间,文件名,行数,你需要的信息
2 注意各个数据的切分
3 注意数据的长度
**/
void klogMesg(int level, char *file,int line,const char *fmt, ...){
char str_format[MAX_LOG_LEN];
char buffer[MAX_LOG_LEN];
va_list args;
memset(str_format, '\0', MAX_LOG_LEN);
memset(buffer, '\0', MAX_LOG_LEN);
char *atime = getCurrentTime();
//获取当前的需要格式化的字符串
if (KL.is_show_line == 1){
snprintf(str_format, MAX_LOG_LEN,"%s%s%s:%d%s%s%s%s",
KLONG_NAME[level],KL.splite_char,file,line,KL.splite_char,
atime,KL.splite_char,fmt);
}else{
snprintf(str_format, MAX_LOG_LEN,"%s%s%s%s%s\n",
KLONG_NAME[level],KL.splite_char,
atime,KL.splite_char,fmt);
}
//获取需要拼接的字符串
va_start(args,fmt);
size_t buf_len = vsnprintf(buffer,MAX_LOG_LEN, str_format,args);
va_end(args);
//拼接出需要的字符串,然后根据flag输出到对应的fd里面
if ((KL.flag & PUT_STD_OUT) == PUT_STD_OUT) {
printf("%s",buffer);
fflush(stdout);
}
if ((KL.flag & PUT_STD_ERR) == PUT_STD_ERR) {
printf("%s",buffer);
fflush(stderr);
}
if ((KL.flag & PUT_SYSLOG) == PUT_SYSLOG) {
syslog(level, buffer,"");
}
if ((KL.flag & PUT_SFILE) == PUT_SFILE) {
write(KL.fd, buffer, buf_len);
}
free(atime);
}
void test_log(){
printf("test it\n");
int ret;
//打开日志
ret = logInit("/Users/kang/Documents/CppProject/xcode/mylib/mylib/t.log",PUT_STD_OUT | PUT_SFILE);//| PUT_SYSLOG);
if (ret < 0) {
puts("\nopen log error\n");
}else{
puts("open log sucess\n");
}
//打印当前时间
char *ptime;
ptime = getCurrentTime();
printf("%s;len=%ld\n",ptime,strlen(ptime));
//打印级别
printf("kl.flag=%x\n",(int)getLogerFlag());
//写日志
klogTrace("%s","atest");
klogDebug("%s","atest");
klogInfo("%s","atest");
klogWarning("%s","atest");
klogError("%s","atest");
klogFatal("%s","atest");
//写日志
setShowFile(1);
setSpliteData("||");
klogTrace("%s","atest");
ret = logClose();
if (ret < 0) {
puts("close log error\n");
}else{
puts("close log sucess\n");
}
}