/[LeafOK_CVS]/lbbs/src/log.c
ViewVC logotype

Annotation of /lbbs/src/log.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.37 - (hide annotations)
Thu Dec 18 14:47:00 2025 UTC (2 months, 4 weeks ago) by sysadm
Branch: MAIN
Changes since 1.36: +79 -26 lines
Content type: text/x-csrc
Refine and bug fix

1 sysadm 1.27 /* SPDX-License-Identifier: GPL-3.0-or-later */
2     /*
3     * log
4     * - logger
5     *
6 sysadm 1.28 * Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com>
7 sysadm 1.27 */
8 sysadm 1.1
9 sysadm 1.31 #ifdef HAVE_CONFIG_H
10     #include "config.h"
11     #endif
12    
13 sysadm 1.26 #include "common.h"
14     #include "io.h"
15 sysadm 1.21 #include "log.h"
16 sysadm 1.35 #include <errno.h>
17 sysadm 1.6 #include <stdarg.h>
18 sysadm 1.24 #include <string.h>
19 sysadm 1.6 #include <time.h>
20 sysadm 1.10 #include <unistd.h>
21 sysadm 1.24 #include <sys/types.h>
22 sysadm 1.19
23 sysadm 1.30 enum _log_constant_t
24     {
25     STR_LOG_TIME_MAX_LEN = 50,
26     };
27 sysadm 1.22
28 sysadm 1.33 static char path_common_log[FILE_PATH_LEN];
29     static char path_error_log[FILE_PATH_LEN];
30 sysadm 1.37 static FILE *fp_common_log = NULL;
31     static FILE *fp_error_log = NULL;
32 sysadm 1.33 static int redir_common_log = 0;
33     static int redir_error_log = 0;
34 sysadm 1.1
35 sysadm 1.29 int log_begin(const char *common_log_file, const char *error_log_file)
36 sysadm 1.1 {
37 sysadm 1.33 strncpy(path_common_log, common_log_file, sizeof(path_common_log) - 1);
38     path_common_log[sizeof(path_common_log) - 1] = '\0';
39     strncpy(path_error_log, error_log_file, sizeof(path_error_log) - 1);
40     path_error_log[sizeof(path_error_log) - 1] = '\0';
41    
42     fp_common_log = fopen(path_common_log, "a");
43 sysadm 1.20 if (fp_common_log == NULL)
44 sysadm 1.11 {
45 sysadm 1.37 fprintf(stderr, "fopen(%s) error: %s\n", path_common_log, strerror(errno));
46 sysadm 1.11 return -1;
47     }
48 sysadm 1.1
49 sysadm 1.33 fp_error_log = fopen(path_error_log, "a");
50 sysadm 1.20 if (fp_error_log == NULL)
51 sysadm 1.11 {
52 sysadm 1.37 fprintf(stderr, "fopen(%s) error: %s\n", path_error_log, strerror(errno));
53     fclose(fp_common_log);
54     fp_common_log = NULL;
55 sysadm 1.11 return -2;
56     }
57 sysadm 1.1
58 sysadm 1.33 redir_common_log = 0;
59     redir_error_log = 0;
60    
61 sysadm 1.11 return 0;
62 sysadm 1.1 }
63    
64 sysadm 1.13 void log_end()
65 sysadm 1.1 {
66 sysadm 1.37 if (fp_common_log)
67     {
68     fclose(fp_common_log);
69     fp_common_log = NULL;
70     }
71     if (fp_error_log)
72     {
73     fclose(fp_error_log);
74     fp_error_log = NULL;
75     }
76 sysadm 1.1 }
77    
78 sysadm 1.37 inline static int log_head(char *buf, size_t len, int log_level, const char *app_file, int app_line)
79 sysadm 1.2 {
80 sysadm 1.11 time_t t;
81 sysadm 1.18 struct tm gm_tm;
82 sysadm 1.22 char s_time[STR_LOG_TIME_MAX_LEN + 1];
83 sysadm 1.37 int ret;
84 sysadm 1.9
85 sysadm 1.18 time(&t);
86     gmtime_r(&t, &gm_tm);
87     strftime(s_time, sizeof(s_time), "%Y-%m-%d %H:%M:%S", &gm_tm);
88 sysadm 1.9
89 sysadm 1.22 if (log_level == LOG_LEVEL_COMMON)
90     {
91 sysadm 1.37 ret = snprintf(buf, len, "[%s] [%d] [INFO] ", s_time, getpid());
92 sysadm 1.22 }
93 sysadm 1.36 else if (log_level == LOG_LEVEL_ERROR)
94 sysadm 1.22 {
95 sysadm 1.37 ret = snprintf(buf, len, "[%s] [%d] [ERROR] [%s:%d] ", s_time, getpid(), app_file, app_line);
96 sysadm 1.22 }
97 sysadm 1.36 else // if (log_level == LOG_LEVEL_DEBUG)
98     {
99 sysadm 1.37 ret = snprintf(buf, len, "[%s] [%d] [DEBUG] [%s:%d] ", s_time, getpid(), app_file, app_line);
100 sysadm 1.36 }
101 sysadm 1.37
102     return ret;
103 sysadm 1.2 }
104    
105 sysadm 1.29 int log_printf(enum log_level_t log_level, const char *app_file, int app_line, const char *format, ...)
106 sysadm 1.1 {
107 sysadm 1.11 va_list args;
108 sysadm 1.21 char buf[LINE_BUFFER_LEN];
109 sysadm 1.22 FILE *fp_log;
110 sysadm 1.37 int offset;
111     int ret;
112 sysadm 1.2
113 sysadm 1.36 fp_log = (log_level == LOG_LEVEL_COMMON ? fp_common_log : fp_error_log);
114 sysadm 1.1
115 sysadm 1.37 offset = log_head(buf, sizeof(buf), log_level, app_file, app_line);
116 sysadm 1.3
117 sysadm 1.11 va_start(args, format);
118 sysadm 1.37 ret = vsnprintf(buf + offset, sizeof(buf) - (size_t)offset, format, args);
119 sysadm 1.11 va_end(args);
120 sysadm 1.2
121 sysadm 1.37 if (ret < 0)
122     {
123     // Encoding error
124     return -1;
125     }
126     else if (offset + ret >= sizeof(buf))
127     {
128     buf[sizeof(buf) - 2] = '\n'; // Add newline for truncated messages
129     buf[sizeof(buf) - 1] = '\0'; // Ensure null termination
130     if (fputs(buf, fp_log) == EOF)
131     {
132     return -3; // Write error
133     }
134     ret = -2; // Indicate truncation
135     }
136     else
137     {
138     if (fputs(buf, fp_log) == EOF)
139     {
140     return -3; // Write error
141     }
142     ret = offset + ret;
143     }
144    
145     if (fflush(fp_log) == EOF)
146     {
147     return -4; // Flush error
148     }
149 sysadm 1.1
150 sysadm 1.37 return ret;
151 sysadm 1.1 }
152 sysadm 1.5
153 sysadm 1.20 int log_common_redir(int fd)
154 sysadm 1.5 {
155 sysadm 1.33 redir_common_log = 1;
156 sysadm 1.32 return dup2(fd, fileno(fp_common_log));
157 sysadm 1.5 }
158    
159 sysadm 1.20 int log_error_redir(int fd)
160 sysadm 1.5 {
161 sysadm 1.33 redir_error_log = 1;
162 sysadm 1.32 return dup2(fd, fileno(fp_error_log));
163 sysadm 1.5 }
164 sysadm 1.33
165     int log_restart(void)
166     {
167 sysadm 1.37 FILE *fp_common = NULL;
168     FILE *fp_error = NULL;
169 sysadm 1.33
170     if (!redir_common_log)
171     {
172 sysadm 1.37 fp_common = fopen(path_common_log, "a");
173     if (fp_common == NULL)
174 sysadm 1.33 {
175 sysadm 1.37 log_error("fopen(%s) error: %s\n", path_common_log, strerror(errno));
176 sysadm 1.33 return -1;
177     }
178     }
179    
180     if (!redir_error_log)
181     {
182 sysadm 1.37 fp_error = fopen(path_error_log, "a");
183     if (fp_error == NULL)
184 sysadm 1.33 {
185 sysadm 1.37 log_error("fopen(%s) error: %s\n", path_error_log, strerror(errno));
186     if (fp_common)
187     {
188     fclose(fp_common);
189     }
190 sysadm 1.33 return -2;
191     }
192 sysadm 1.37 }
193    
194     // Apply new file pointers
195     if (fp_common)
196     {
197     fclose(fp_common_log);
198     fp_common_log = fp_common;
199     }
200     if (fp_error)
201     {
202 sysadm 1.33 fclose(fp_error_log);
203 sysadm 1.37 fp_error_log = fp_error;
204 sysadm 1.33 }
205    
206     return 0;
207     }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1