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

Annotation of /lbbs/src/log.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.38 - (hide annotations)
Fri Dec 19 06:16:27 2025 UTC (2 months, 3 weeks ago) by sysadm
Branch: MAIN
Changes since 1.37: +6 -4 lines
Content type: text/x-csrc
Append \n to the end of logging message by log_...()
Remove ending \n from each logging message

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 sysadm 1.38 else if (offset + ret + 1 >= sizeof(buf))
127 sysadm 1.37 {
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 sysadm 1.38 buf[offset + ret] = '\n'; // Add newline
139     buf[offset + ret + 1] = '\0'; // Ensure null termination
140 sysadm 1.37 if (fputs(buf, fp_log) == EOF)
141     {
142     return -3; // Write error
143     }
144 sysadm 1.38 ret = offset + ret + 1; // Return number of characters written (including newline)
145 sysadm 1.37 }
146    
147     if (fflush(fp_log) == EOF)
148     {
149     return -4; // Flush error
150     }
151 sysadm 1.1
152 sysadm 1.37 return ret;
153 sysadm 1.1 }
154 sysadm 1.5
155 sysadm 1.20 int log_common_redir(int fd)
156 sysadm 1.5 {
157 sysadm 1.33 redir_common_log = 1;
158 sysadm 1.32 return dup2(fd, fileno(fp_common_log));
159 sysadm 1.5 }
160    
161 sysadm 1.20 int log_error_redir(int fd)
162 sysadm 1.5 {
163 sysadm 1.33 redir_error_log = 1;
164 sysadm 1.32 return dup2(fd, fileno(fp_error_log));
165 sysadm 1.5 }
166 sysadm 1.33
167     int log_restart(void)
168     {
169 sysadm 1.37 FILE *fp_common = NULL;
170     FILE *fp_error = NULL;
171 sysadm 1.33
172     if (!redir_common_log)
173     {
174 sysadm 1.37 fp_common = fopen(path_common_log, "a");
175     if (fp_common == NULL)
176 sysadm 1.33 {
177 sysadm 1.38 log_error("fopen(%s) error: %s", path_common_log, strerror(errno));
178 sysadm 1.33 return -1;
179     }
180     }
181    
182     if (!redir_error_log)
183     {
184 sysadm 1.37 fp_error = fopen(path_error_log, "a");
185     if (fp_error == NULL)
186 sysadm 1.33 {
187 sysadm 1.38 log_error("fopen(%s) error: %s", path_error_log, strerror(errno));
188 sysadm 1.37 if (fp_common)
189     {
190     fclose(fp_common);
191     }
192 sysadm 1.33 return -2;
193     }
194 sysadm 1.37 }
195    
196     // Apply new file pointers
197     if (fp_common)
198     {
199     fclose(fp_common_log);
200     fp_common_log = fp_common;
201     }
202     if (fp_error)
203     {
204 sysadm 1.33 fclose(fp_error_log);
205 sysadm 1.37 fp_error_log = fp_error;
206 sysadm 1.33 }
207    
208     return 0;
209     }

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