logger_server.anubis
11.2 KB
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
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
/*
* Created by PyramIDE.
* User: フランスのトトロ aka (David RENÉ)
* Date: 01/12/2019
* Time: 02:08
* © David RENÉ
*/
read tools/basis.anubis
read system/logger.anubis
read system/data_io.anubis
read system/string.anubis
read system/files.anubis
read system/parameter/inifile.anubis
read system/message_queue.anubis
read calexium_lib/CXM_message_constants.anubis
read logger_client.anubis
type UID_loggers:
uid_loggers(
String uid,
String base_dir,
Var(List(Logger)) loggers
)
.
/** get_uid_loggers
*/
define Maybe(UID_loggers)
get_uid_loggers
(
List(UID_loggers) all_loggers, //all known logger
String _uid //searched UID loggers
)=
if all_loggers is
{
[] then failure,
[h . t] then
if h.uid = _uid then
success(h)
else
get_uid_loggers(t, _uid)
}
.
define Maybe(Logger)
get_logger_from_uid
(
List(UID_loggers) all_loggers,
String _uid,
String log_name,
Logger anb_logger
)=
if all_loggers is
{
[] then failure,
[h . t] then
if h.uid = _uid then
if get_logger(*h.loggers, log_name) is
{
failure then logError(anb_logger, "can't find log ["+log_name+"] in uid ["+_uid+"]");failure,
success(log) then success(log)
}
else
get_logger_from_uid(t, _uid, log_name, anb_logger)
}
.
define Maybe(Logger)
create_logger_from_message
(
Logger anb_logger,
Message msg,
String base_directory
)=
if find_string(msg, "LOG_NAME") is {failure then logError(anb_logger, "create_logger_from_message can't find LOG_NAME");failure, success(loggerName) then
if find_int32 (msg, "FORMAT_SIZE") is {failure then logError(anb_logger, "create_logger_from_message can't find FORMAT_SIZE");failure, success(formatting_size) then
if find_string(msg, "FILE_NAME") is {failure then logError(anb_logger, "create_logger_from_message can't find FILE_NAME");failure, success(fileName) then
if find_int32 (msg, "FILE_LEVEL") is {failure then logError(anb_logger, "create_logger_from_message can't find FILE_LEVEL");failure,success(_fileLevel) then
if find_int32 (msg, "CONS_LEVEL") is {failure then logError(anb_logger, "create_logger_from_message can't find CONS_LEVEL");failure,success(_consoleLevel) then
with file_level = get_LogLevel_from_value(to_Int(_fileLevel)),
with console_level = get_LogLevel_from_value(to_Int(_consoleLevel)),
with final_file_path = base_directory + fileName,
make_directories(final_file_path);
logInfo(anb_logger, "create_logger_from_message logger name ["+loggerName+"] format size["+formatting_size+"] file name["+fileName+"] file level ["+get_log_level_char(file_level)+"] console level ["+get_log_level_char(console_level)+"]");
success(createLogger(loggerName, to_Int(formatting_size), final_file_path, file_level, console_level))
}}}}}
.
/** register one logger into UID
*/
define One
register_logger
(
Var(List(UID_loggers)) logs,
Message msg,
String base_directory,
Logger anb_logger
)=
if find_string(msg, "UID") is { failure then logError(anb_logger, "register_logger UID not found"), success(uid) then
if find_string(msg, "LOG_NAME") is { failure then logError(anb_logger, "register_logger can't find LOG_NAME"), success(log_name) then
if get_uid_loggers(*logs, uid) is
{
failure then //the uid logger doesn't exists so we create and
logError(anb_logger, "register_logger UID logger ["+uid+"] doesn't exist. Please register the UID first"),
success(_uid_log) then
if get_logger(*_uid_log.loggers, log_name) is
{
failure then
if create_logger_from_message(anb_logger, msg, _uid_log.base_dir) is
{
failure then unique,
success(new_log) then
_uid_log.loggers <- [new_log . *_uid_log.loggers];
logInfo(anb_logger, "register_logger: logger ["+log_name+"] created in ["+uid+"]")
}
success(_) then
logWarning(anb_logger, "register_logger: logger ["+log_name+"] already exists in ["+uid+"]")
}
}
}}
.
define One
register_uid
(
Var(List(UID_loggers)) logs,
Message msg,
String log_server_base_dir,
Logger anb_logger
)=
if find_string(msg, "UID") is { failure then logError(anb_logger, "register_uid can't find UID field"), success(uid) then
with default_path = find_string(msg, "DEFAULT_PATH", "/"),
abs_path = find_bool(msg, "ABSOLUTE_PATH", false),
if get_uid_loggers(*logs, uid) is
{
failure then //the uid logger doesn't exists so we create and
with base_dir = if abs_path then default_path else log_server_base_dir + default_path,
with new_uid = uid_loggers(uid, base_dir, var([])),
logs <- [ new_uid . *logs];
logInfo(anb_logger, "register_uid UID logger ["+uid+"] success with base dir '"+base_dir+"'.")
success(_) then
logError(anb_logger, "register_uid UID logger ["+uid+"] already exists.")
}}
.
define Bool
process_log
(
Logger log,
Message msg
)=
if find_string(msg, "LOG_STRING") is {failure then logError(log, "process_log can't find LOG_STRING");false, success(log_string) then
if find_int32 (msg, "LEVEL") is {failure then logError(log, "process_log can't find LEVEL");false, success(int_level) then
if find_int32 (msg, "THREAD_ID") is {failure then logError(log, "process_log can't find THREAD_ID");false, success(thread_id) then
with level = get_LogLevel_from_value(to_Int(int_level)),
if level is logTrace then
if find_string(msg, "LOG_MASK") is
{
failure then
//println("process_log can't find LogMask ["+log_string+"]");
logError(log, "process_log can't find LOG_MASK");false,
success(log_mask) then logTrace(log, logMask(log_mask), log_string, thread_id); true
}
else doLog(log, log_string, level, thread_id); true
}
}
}.
define Bool
process_log
(
List(Logger) logs,
Message msg
)=
if find_string(msg, "LOG_NAME") is
{
failure then println("process_log can't find LOG_NAME");false,
success(log_name) then
if get_logger(logs, log_name) is
{
failure then println("can't find log ["+log_name+"]");false,
success(log) then process_log(log, msg)
}
}
.
define Bool
process_log
(
List(UID_loggers) logs,
Message msg,
Logger anb_logger
)=
with uid = if find_string(msg, "UID") is { failure then "", success(_uid) then _uid},
if find_string(msg, "LOG_NAME") is
{
failure then logError(anb_logger, "process_log can't find LOG_NAME");false,
success(log_name) then
if get_logger_from_uid(logs, uid, log_name, anb_logger) is
{
failure then logError(anb_logger, "can't find log ["+log_name+"] in ["+uid+"]");false,
success(log) then process_log(log, msg)
}
}
.
public define String
data_preview
(
ByteArray data,
Int max
) =
with l = length(data),
firsts_bytes = extract(data, 0, max),
"Length=" + l + "; String='"+to_string(firsts_bytes)+"' Buffer=[" + to_ascii(firsts_bytes) + (if l > max then "...]" else "]").
define (UDP_Socket, ByteArray, Truncation, Word32, Word32) -> One
make_udp_handler
(
Var(List(UID_loggers)) logs,
String base_directory,
Logger anb_logger
) =
(
UDP_Socket socket,
ByteArray data,
Truncation truncation,
Word32 ip_address,
Word32 ip_port
) |->
with ip = ip_addr_to_string(ip_address),
logTrace(anb_logger, logMask("Logger"), "LoggerServer: data received (" + length(data) + " bytes) from IP " + ip + "... ");
//println("LoggerServer: data received (" + length(data) + " bytes) from IP " + ip + "... ");
//println("LoggerServer: data_preview " + data_preview(data, 20));
if receive_message_from_io(make_data_io(data)) is
{
failure then
//println("LoggerServer: Bad data packet received from IP " + ip + ": " + data_preview(data, 20));
logWarning(anb_logger, "LoggerServer: Bad data packet received from IP " + ip + ": " + data_preview(data, 20)),
success(msg) then
if *msg.what = _CXM_LOGGER_LOG then
forget(process_log(*logs, msg, anb_logger))
else if *msg.what = _CXM_LOGGER_REGISTER_UID then
forget(register_uid(logs, msg, base_directory, anb_logger))
else if *msg.what = _CXM_LOGGER_REGISTER_LOG then
forget(register_logger(logs, msg, base_directory, anb_logger))
else
logError(anb_logger, "LoggerService: wrong message_received. [" + to_hexa(*msg.what) + "] is not _CXM_LOGGER_LOG or _CXM_LOGGER_REGISTER or _CXM_LOGGER_UNREGISTER ")
}
.
define One
my_notify
(
One dummy
) =
unique.
public define Maybe(UDP_Server)
start_logger_server
(
Var(List(UID_loggers)) logs,
Logger anb_logger,
Word32 logger_listen_port,
String base_directory
) =
if start_udp_server(0,
logger_listen_port,
make_udp_handler(logs, base_directory, anb_logger),
8*1024,
my_notify) is
{
cannot_create_the_socket then logError(anb_logger, "Cannot create the listening socket."); failure,
cannot_bind_address_port then logError(anb_logger, "Cannot bind to port " + logger_listen_port + "."); failure,
access_denied then logError(anb_logger, "Cannot listen on port " + logger_listen_port + "."); failure,
ok(server) then logInfo(anb_logger, "LocalLog Server started on port " + logger_listen_port + "."); success(server)
}
.
read locale/L3LanguageInfo.anubis //date and time formating
define Var(List(UID_loggers))
create_default_loggers
(
String log_server_base_dir
)
=
//none uid for extended libraryet etc...
with base_dir = log_server_base_dir + "/unknown/",
sql = createLogger("SQL", 8, base_dir+"sql.log", logTrace, logTrace),
db = createLogger("SDB", 8, base_dir+"db.log", logTrace, logTrace),
sql_trace = createLogger("SQL_TRACE", 8, base_dir+"sql.log", logTrace, logTrace),
make_directories(base_dir);
with uid = uid_loggers("", base_dir, var([sql, db, sql_trace])),
var([uid])
.
global define One
anb_log
(
List(String) args
)=
with product_time = to_Int(__TIME__),
with anb_log_path = find_and_replace(my_anubis_directory, "\\", "/") + "/anb_log/",
with ini = loadIniFile(anb_log_path+"config.ini"),
server_port = readWord32(ini, "GENERAL", "udp_port", 45514),
base_directory = readString(ini, "GENERAL", "base_directory", anb_log_path+"log/"),
make_directories(base_directory);
//create own logger
with anb_logger = createLogger("anb_log", 7, base_directory + "anb_log.log", logTrace, logTrace),
logInfo(anb_logger, "start anb_log "+datef_ymd(product_time) + " " + dhour_format(product_time));
forget(start_logger_server(create_default_loggers(base_directory), anb_logger, server_port, base_directory))
.