16
16
17
17
-module (rabbit_lager ).
18
18
19
- -include ( " rabbit_log.hrl" ).
19
+ -include_lib ( " rabbit_common/include/ rabbit_log.hrl" ).
20
20
21
21
% % API
22
22
-export ([start_logger /0 , log_locations /0 , fold_sinks /2 ,
26
26
-export ([configure_lager /0 ]).
27
27
28
28
start_logger () ->
29
- application :stop (lager ),
30
- application :stop (syslog ),
31
- ensure_lager_configured (),
32
- application :ensure_all_started (syslog ),
33
- lager :start (),
29
+ ok = maybe_remove_logger_handler (),
30
+ ok = app_utils :stop_applications ([lager , syslog ]),
31
+ ok = ensure_lager_configured (),
32
+ ok = app_utils :start_applications ([lager ]),
34
33
fold_sinks (
35
34
fun
36
35
(_ , [], Acc ) ->
@@ -176,9 +175,12 @@ lager_configured() ->
176
175
application :get_env (syslog , syslog_error_logger ) =/= undefined .
177
176
178
177
configure_lager () ->
179
- application :load (lager ),
180
- application :load (syslog ),
178
+ ok = app_utils :load_applications ([lager ]),
181
179
% % Turn off reformatting for error_logger messages
180
+ case application :get_env (lager , error_logger_redirect ) of
181
+ undefined -> application :set_env (lager , error_logger_redirect , true );
182
+ _ -> ok
183
+ end ,
182
184
case application :get_env (lager , error_logger_format_raw ) of
183
185
undefined -> application :set_env (lager , error_logger_format_raw , true );
184
186
_ -> ok
@@ -190,7 +192,7 @@ configure_lager() ->
190
192
% % difference.
191
193
case application :get_env (rabbit , lager_log_root ) of
192
194
{ok , Value } ->
193
- application :set_env (lager , log_root , Value );
195
+ ok = application :set_env (lager , log_root , Value );
194
196
_ ->
195
197
ok
196
198
end ;
@@ -199,7 +201,7 @@ configure_lager() ->
199
201
% % Set rabbit.log config variable based on environment.
200
202
prepare_rabbit_log_config (),
201
203
% % Configure syslog library.
202
- configure_syslog (),
204
+ ok = configure_syslog_error_logger (),
203
205
% % At this point we should have rabbit.log application variable
204
206
% % configured to generate RabbitMQ log handlers.
205
207
GeneratedHandlers = generate_lager_handlers (),
@@ -217,8 +219,8 @@ configure_lager() ->
217
219
FormerRabbitHandlers )
218
220
end ,
219
221
220
- application :set_env (lager , handlers , Handlers ),
221
- application :set_env (lager , rabbit_handlers , GeneratedHandlers ),
222
+ ok = application :set_env (lager , handlers , Handlers ),
223
+ ok = application :set_env (lager , rabbit_handlers , GeneratedHandlers ),
222
224
223
225
% % Setup extra sink/handlers. If they are not configured, redirect
224
226
% % messages to the default sink. To know the list of expected extra
@@ -253,29 +255,60 @@ configure_lager() ->
253
255
[error_logger_lager_event | list_expected_sinks ()],
254
256
SinkConfigs ),
255
257
Sinks = merge_lager_sink_handlers (LagerSinks , GeneratedSinks , []),
256
- application :set_env (lager , extra_sinks , Sinks ),
258
+ ok = application :set_env (lager , extra_sinks , Sinks ),
257
259
258
260
case application :get_env (lager , error_logger_hwm ) of
259
261
undefined ->
260
- application :set_env (lager , error_logger_hwm , 1000 ),
262
+ ok = application :set_env (lager , error_logger_hwm , 1000 ),
261
263
% NB: 50 is the default value in lager.app.src
262
- application :set_env (lager , error_logger_hwm_original , 50 );
264
+ ok = application :set_env (lager , error_logger_hwm_original , 50 );
263
265
{ok , Val } when is_integer (Val ) andalso Val < 1000 ->
264
- application :set_env (lager , error_logger_hwm , 1000 ),
265
- application :set_env (lager , error_logger_hwm_original , Val );
266
+ ok = application :set_env (lager , error_logger_hwm , 1000 ),
267
+ ok = application :set_env (lager , error_logger_hwm_original , Val );
266
268
{ok , Val } ->
267
- application :set_env (lager , error_logger_hwm_original , Val ),
269
+ ok = application :set_env (lager , error_logger_hwm_original , Val ),
268
270
ok
269
271
end ,
270
272
ok .
271
273
272
- configure_syslog () ->
274
+ configure_syslog_error_logger () ->
273
275
% % Disable error_logger forwarding to syslog if it's not configured
274
276
case application :get_env (syslog , syslog_error_logger ) of
275
- undefined -> application :set_env (syslog , syslog_error_logger , false );
277
+ undefined ->
278
+ application :set_env (syslog , syslog_error_logger , false );
276
279
_ -> ok
277
280
end .
278
281
282
+ - define (SYSLOG_LOCAL_IP , {ip ,{127 ,0 ,0 ,1 }}).
283
+ configure_syslog () ->
284
+ ok = app_utils :load_applications ([syslog ]),
285
+ % % https://github.com/schlagert/syslog#configuration
286
+ Protocol = case application :get_env (syslog , protocol ) of
287
+ undefined ->
288
+ {rfc3164 , udp , [? SYSLOG_LOCAL_IP ]};
289
+ % % {protocol,
290
+ % % rfc3164 |
291
+ % % rfc5424 |
292
+ % % {rfc3164 | rfc5424, tcp | udp} |
293
+ % % {rfc3164 | rfc5424, udp, [gen_udp:option()]} |
294
+ % % {rfc3164 | rfc5424, tcp, [gen_tcp:option()]} |
295
+ % % {rfc5424, tls, [ssl:connect_option()]}
296
+ % % }
297
+ {ok , Rfc } when Rfc =:= rfc3164 ; Rfc =:= rfc5424 ->
298
+ {Rfc , udp , [? SYSLOG_LOCAL_IP ]};
299
+ {ok , {Rfc , Transport }} when Rfc =:= rfc3164 ; Rfc =:= rfc5424 ->
300
+ {Rfc , Transport , [? SYSLOG_LOCAL_IP ]};
301
+ {ok , {Rfc , Transport , Opts }} when Rfc =:= rfc3164 ; Rfc =:= rfc5424 ->
302
+ case proplists :lookup (ip , Opts ) of
303
+ none ->
304
+ {Rfc , Transport , [? SYSLOG_LOCAL_IP |Opts ]};
305
+ _ ->
306
+ {Rfc , Transport , Opts }
307
+ end
308
+ end ,
309
+ ok = application :unset_env (syslog , protocol ),
310
+ ok = application :set_env (syslog , protocol , Protocol ).
311
+
279
312
remove_rabbit_handlers (Handlers , FormerHandlers ) ->
280
313
lists :filter (fun (Handler ) ->
281
314
not lists :member (Handler , FormerHandlers )
@@ -317,8 +350,9 @@ lager_backend(exchange) -> lager_exchange_backend.
317
350
% % Syslog backend is using an old API for configuration and
318
351
% % does not support proplists.
319
352
generate_handler (syslog_lager_backend , HandlerConfig ) ->
320
- Level = proplists :get_value (level , HandlerConfig ,
321
- default_config_value (level )),
353
+ DefaultConfigVal = default_config_value (level ),
354
+ Level = proplists :get_value (level , HandlerConfig , DefaultConfigVal ),
355
+ ok = configure_syslog (),
322
356
[{syslog_lager_backend ,
323
357
[Level ,
324
358
{},
@@ -384,7 +418,7 @@ prepare_rabbit_log_config() ->
384
418
385
419
set_env_default_log_disabled () ->
386
420
% % Disabling all the logs.
387
- application :set_env (rabbit , log , []).
421
+ ok = application :set_env (rabbit , log , []).
388
422
389
423
set_env_default_log_console () ->
390
424
LogConfig = application :get_env (rabbit , log , []),
@@ -395,7 +429,7 @@ set_env_default_log_console() ->
395
429
{enabled , true })}),
396
430
% % Remove the file handler - disable logging to file
397
431
LogConfigConsoleNoFile = lists :keydelete (file , 1 , LogConfigConsole ),
398
- application :set_env (rabbit , log , LogConfigConsoleNoFile ).
432
+ ok = application :set_env (rabbit , log , LogConfigConsoleNoFile ).
399
433
400
434
set_env_default_log_file (FileName , Override ) ->
401
435
LogConfig = application :get_env (rabbit , log , []),
@@ -416,7 +450,7 @@ set_env_default_log_file(FileName, Override) ->
416
450
LogConfig
417
451
end
418
452
end ,
419
- application :set_env (rabbit , log , NewLogConfig ).
453
+ ok = application :set_env (rabbit , log , NewLogConfig ).
420
454
421
455
set_env_upgrade_log_file (FileName ) ->
422
456
LogConfig = application :get_env (rabbit , log , []),
@@ -436,7 +470,7 @@ set_env_upgrade_log_file(FileName) ->
436
470
% % No cahnge. We don't want to override the configured value.
437
471
_File -> LogConfig
438
472
end ,
439
- application :set_env (rabbit , log , NewLogConfig ).
473
+ ok = application :set_env (rabbit , log , NewLogConfig ).
440
474
441
475
generate_lager_sinks (SinkNames , SinkConfigs ) ->
442
476
lists :map (fun (SinkName ) ->
@@ -523,7 +557,6 @@ merge_lager_sink_handlers([{Name, Sink} | RestSinks], GeneratedSinks, Agg) ->
523
557
end ;
524
558
merge_lager_sink_handlers ([], GeneratedSinks , Agg ) -> GeneratedSinks ++ Agg .
525
559
526
-
527
560
list_expected_sinks () ->
528
561
case application :get_env (rabbit , lager_extra_sinks ) of
529
562
{ok , List } ->
@@ -543,6 +576,20 @@ list_expected_sinks() ->
543
576
% % module is later cover-compiled, the compile option will
544
577
% % be lost, so we will be able to retrieve the list from the
545
578
% % application environment.
546
- application :set_env (rabbit , lager_extra_sinks , List ),
579
+ ok = application :set_env (rabbit , lager_extra_sinks , List ),
547
580
List
548
581
end .
582
+
583
+ maybe_remove_logger_handler () ->
584
+ M = logger ,
585
+ F = remove_handler ,
586
+ try
587
+ ok = erlang :apply (M , F , [default ])
588
+ catch
589
+ error :undef ->
590
+ % OK since the logger module only exists in OTP 21.1 or later
591
+ ok ;
592
+ Err :Reason ->
593
+ error_logger :error_msg (" calling ~p :~p failed: ~p :~p~n " ,
594
+ [M , F , Err , Reason ])
595
+ end .
0 commit comments