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

Annotation of /lbbs/src/log.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.35 - (hide 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 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.22 static FILE *fp_common_log;
31     static FILE *fp_error_log;
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.35 fprintf(stderr, "fopen(%s) error: %d\n", path_common_log, 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.35 fprintf(stderr, "fopen(%s) error: %d\n", path_error_log, errno);
53 sysadm 1.11 return -2;
54     }
55 sysadm 1.1
56 sysadm 1.33 redir_common_log = 0;
57     redir_error_log = 0;
58    
59 sysadm 1.11 return 0;
60 sysadm 1.1 }
61    
62 sysadm 1.13 void log_end()
63 sysadm 1.1 {
64 sysadm 1.20 fclose(fp_common_log);
65     fclose(fp_error_log);
66 sysadm 1.1 }
67    
68 sysadm 1.22 inline static void log_head(char *buf, size_t len, int log_level, const char *app_file, int app_line)
69 sysadm 1.2 {
70 sysadm 1.11 time_t t;
71 sysadm 1.18 struct tm gm_tm;
72 sysadm 1.22 char s_time[STR_LOG_TIME_MAX_LEN + 1];
73 sysadm 1.9
74 sysadm 1.18 time(&t);
75     gmtime_r(&t, &gm_tm);
76     strftime(s_time, sizeof(s_time), "%Y-%m-%d %H:%M:%S", &gm_tm);
77 sysadm 1.9
78 sysadm 1.22 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 sysadm 1.23 snprintf(buf, len, "[%s] [%d] [ERROR] [%s:%d] ", s_time, getpid(), app_file, app_line);
85 sysadm 1.22 }
86 sysadm 1.2 }
87    
88 sysadm 1.29 int log_printf(enum log_level_t log_level, const char *app_file, int app_line, const char *format, ...)
89 sysadm 1.1 {
90 sysadm 1.11 va_list args;
91     int retval;
92 sysadm 1.21 char buf[LINE_BUFFER_LEN];
93 sysadm 1.22 FILE *fp_log;
94 sysadm 1.2
95 sysadm 1.22 fp_log = (log_level == LOG_LEVEL_ERROR ? fp_error_log : fp_common_log);
96 sysadm 1.1
97 sysadm 1.22 log_head(buf, sizeof(buf), log_level, app_file, app_line);
98 sysadm 1.14 strncat(buf, format, sizeof(buf) - strnlen(buf, sizeof(buf)));
99 sysadm 1.3
100 sysadm 1.11 va_start(args, format);
101 sysadm 1.22 retval = vfprintf(fp_log, buf, args);
102 sysadm 1.11 va_end(args);
103 sysadm 1.2
104 sysadm 1.22 fflush(fp_log);
105 sysadm 1.1
106 sysadm 1.11 return retval;
107 sysadm 1.1 }
108 sysadm 1.5
109 sysadm 1.20 int log_common_redir(int fd)
110 sysadm 1.5 {
111 sysadm 1.33 redir_common_log = 1;
112 sysadm 1.32 return dup2(fd, fileno(fp_common_log));
113 sysadm 1.5 }
114    
115 sysadm 1.20 int log_error_redir(int fd)
116 sysadm 1.5 {
117 sysadm 1.33 redir_error_log = 1;
118 sysadm 1.32 return dup2(fd, fileno(fp_error_log));
119 sysadm 1.5 }
120 sysadm 1.33
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 sysadm 1.35 log_error("fopen(%s) error: %d\n", path_common_log, errno);
131 sysadm 1.33 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 sysadm 1.35 log_error("fopen(%s) error: %d\n", path_error_log, errno);
143 sysadm 1.33 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