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

Contents of /lbbs/src/log.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.35 - (show annotations)
Mon Nov 17 11:22:16 2025 UTC (3 months, 4 weeks ago) by sysadm
Branch: MAIN
Changes since 1.34: +5 -4 lines
Content type: text/x-csrc
Refine

1 /* SPDX-License-Identifier: GPL-3.0-or-later */
2 /*
3 * log
4 * - logger
5 *
6 * Copyright (C) 2004-2025 Leaflet <leaflet@leafok.com>
7 */
8
9 #ifdef HAVE_CONFIG_H
10 #include "config.h"
11 #endif
12
13 #include "common.h"
14 #include "io.h"
15 #include "log.h"
16 #include <errno.h>
17 #include <stdarg.h>
18 #include <string.h>
19 #include <time.h>
20 #include <unistd.h>
21 #include <sys/types.h>
22
23 enum _log_constant_t
24 {
25 STR_LOG_TIME_MAX_LEN = 50,
26 };
27
28 static char path_common_log[FILE_PATH_LEN];
29 static char path_error_log[FILE_PATH_LEN];
30 static FILE *fp_common_log;
31 static FILE *fp_error_log;
32 static int redir_common_log = 0;
33 static int redir_error_log = 0;
34
35 int log_begin(const char *common_log_file, const char *error_log_file)
36 {
37 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 if (fp_common_log == NULL)
44 {
45 fprintf(stderr, "fopen(%s) error: %d\n", path_common_log, errno);
46 return -1;
47 }
48
49 fp_error_log = fopen(path_error_log, "a");
50 if (fp_error_log == NULL)
51 {
52 fprintf(stderr, "fopen(%s) error: %d\n", path_error_log, errno);
53 return -2;
54 }
55
56 redir_common_log = 0;
57 redir_error_log = 0;
58
59 return 0;
60 }
61
62 void log_end()
63 {
64 fclose(fp_common_log);
65 fclose(fp_error_log);
66 }
67
68 inline static void log_head(char *buf, size_t len, int log_level, const char *app_file, int app_line)
69 {
70 time_t t;
71 struct tm gm_tm;
72 char s_time[STR_LOG_TIME_MAX_LEN + 1];
73
74 time(&t);
75 gmtime_r(&t, &gm_tm);
76 strftime(s_time, sizeof(s_time), "%Y-%m-%d %H:%M:%S", &gm_tm);
77
78 if (log_level == LOG_LEVEL_COMMON)
79 {
80 snprintf(buf, len, "[%s] [%d] [INFO] ", s_time, getpid());
81 }
82 else // if (log_level == LOG_LEVEL_ERROR)
83 {
84 snprintf(buf, len, "[%s] [%d] [ERROR] [%s:%d] ", s_time, getpid(), app_file, app_line);
85 }
86 }
87
88 int log_printf(enum log_level_t log_level, const char *app_file, int app_line, const char *format, ...)
89 {
90 va_list args;
91 int retval;
92 char buf[LINE_BUFFER_LEN];
93 FILE *fp_log;
94
95 fp_log = (log_level == LOG_LEVEL_ERROR ? fp_error_log : fp_common_log);
96
97 log_head(buf, sizeof(buf), log_level, app_file, app_line);
98 strncat(buf, format, sizeof(buf) - strnlen(buf, sizeof(buf)));
99
100 va_start(args, format);
101 retval = vfprintf(fp_log, buf, args);
102 va_end(args);
103
104 fflush(fp_log);
105
106 return retval;
107 }
108
109 int log_common_redir(int fd)
110 {
111 redir_common_log = 1;
112 return dup2(fd, fileno(fp_common_log));
113 }
114
115 int log_error_redir(int fd)
116 {
117 redir_error_log = 1;
118 return dup2(fd, fileno(fp_error_log));
119 }
120
121 int log_restart(void)
122 {
123 FILE *fp;
124
125 if (!redir_common_log)
126 {
127 fp = fopen(path_common_log, "a");
128 if (fp == NULL)
129 {
130 log_error("fopen(%s) error: %d\n", path_common_log, errno);
131 return -1;
132 }
133 fclose(fp_common_log);
134 fp_common_log = fp;
135 }
136
137 if (!redir_error_log)
138 {
139 fp = fopen(path_error_log, "a");
140 if (fp == NULL)
141 {
142 log_error("fopen(%s) error: %d\n", path_error_log, errno);
143 return -2;
144 }
145 fclose(fp_error_log);
146 fp_error_log = fp;
147 }
148
149 return 0;
150 }

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