1616
1717-module (rabbit_lager ).
1818
19- -include ( " rabbit_log.hrl" ).
19+ -include_lib ( " rabbit_common/include/ rabbit_log.hrl" ).
2020
2121% % API
2222-export ([start_logger /0 , log_locations /0 , fold_sinks /2 ,
2626-export ([configure_lager /0 ]).
2727
2828start_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 ]),
3433 fold_sinks (
3534 fun
3635 (_ , [], Acc ) ->
@@ -176,9 +175,12 @@ lager_configured() ->
176175 application :get_env (syslog , syslog_error_logger ) =/= undefined .
177176
178177configure_lager () ->
179- application :load (lager ),
180- application :load (syslog ),
178+ ok = app_utils :load_applications ([lager ]),
181179 % % 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 ,
182184 case application :get_env (lager , error_logger_format_raw ) of
183185 undefined -> application :set_env (lager , error_logger_format_raw , true );
184186 _ -> ok
@@ -190,7 +192,7 @@ configure_lager() ->
190192 % % difference.
191193 case application :get_env (rabbit , lager_log_root ) of
192194 {ok , Value } ->
193- application :set_env (lager , log_root , Value );
195+ ok = application :set_env (lager , log_root , Value );
194196 _ ->
195197 ok
196198 end ;
@@ -199,7 +201,7 @@ configure_lager() ->
199201 % % Set rabbit.log config variable based on environment.
200202 prepare_rabbit_log_config (),
201203 % % Configure syslog library.
202- configure_syslog (),
204+ ok = configure_syslog_error_logger (),
203205 % % At this point we should have rabbit.log application variable
204206 % % configured to generate RabbitMQ log handlers.
205207 GeneratedHandlers = generate_lager_handlers (),
@@ -217,8 +219,8 @@ configure_lager() ->
217219 FormerRabbitHandlers )
218220 end ,
219221
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 ),
222224
223225 % % Setup extra sink/handlers. If they are not configured, redirect
224226 % % messages to the default sink. To know the list of expected extra
@@ -253,29 +255,60 @@ configure_lager() ->
253255 [error_logger_lager_event | list_expected_sinks ()],
254256 SinkConfigs ),
255257 Sinks = merge_lager_sink_handlers (LagerSinks , GeneratedSinks , []),
256- application :set_env (lager , extra_sinks , Sinks ),
258+ ok = application :set_env (lager , extra_sinks , Sinks ),
257259
258260 case application :get_env (lager , error_logger_hwm ) of
259261 undefined ->
260- application :set_env (lager , error_logger_hwm , 1000 ),
262+ ok = application :set_env (lager , error_logger_hwm , 1000 ),
261263 % 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 );
263265 {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 );
266268 {ok , Val } ->
267- application :set_env (lager , error_logger_hwm_original , Val ),
269+ ok = application :set_env (lager , error_logger_hwm_original , Val ),
268270 ok
269271 end ,
270272 ok .
271273
272- configure_syslog () ->
274+ configure_syslog_error_logger () ->
273275 % % Disable error_logger forwarding to syslog if it's not configured
274276 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 );
276279 _ -> ok
277280 end .
278281
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+
279312remove_rabbit_handlers (Handlers , FormerHandlers ) ->
280313 lists :filter (fun (Handler ) ->
281314 not lists :member (Handler , FormerHandlers )
@@ -317,8 +350,9 @@ lager_backend(exchange) -> lager_exchange_backend.
317350% % Syslog backend is using an old API for configuration and
318351% % does not support proplists.
319352generate_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 (),
322356 [{syslog_lager_backend ,
323357 [Level ,
324358 {},
@@ -384,7 +418,7 @@ prepare_rabbit_log_config() ->
384418
385419set_env_default_log_disabled () ->
386420 % % Disabling all the logs.
387- application :set_env (rabbit , log , []).
421+ ok = application :set_env (rabbit , log , []).
388422
389423set_env_default_log_console () ->
390424 LogConfig = application :get_env (rabbit , log , []),
@@ -395,7 +429,7 @@ set_env_default_log_console() ->
395429 {enabled , true })}),
396430 % % Remove the file handler - disable logging to file
397431 LogConfigConsoleNoFile = lists :keydelete (file , 1 , LogConfigConsole ),
398- application :set_env (rabbit , log , LogConfigConsoleNoFile ).
432+ ok = application :set_env (rabbit , log , LogConfigConsoleNoFile ).
399433
400434set_env_default_log_file (FileName , Override ) ->
401435 LogConfig = application :get_env (rabbit , log , []),
@@ -416,7 +450,7 @@ set_env_default_log_file(FileName, Override) ->
416450 LogConfig
417451 end
418452 end ,
419- application :set_env (rabbit , log , NewLogConfig ).
453+ ok = application :set_env (rabbit , log , NewLogConfig ).
420454
421455set_env_upgrade_log_file (FileName ) ->
422456 LogConfig = application :get_env (rabbit , log , []),
@@ -436,7 +470,7 @@ set_env_upgrade_log_file(FileName) ->
436470 % % No cahnge. We don't want to override the configured value.
437471 _File -> LogConfig
438472 end ,
439- application :set_env (rabbit , log , NewLogConfig ).
473+ ok = application :set_env (rabbit , log , NewLogConfig ).
440474
441475generate_lager_sinks (SinkNames , SinkConfigs ) ->
442476 lists :map (fun (SinkName ) ->
@@ -523,7 +557,6 @@ merge_lager_sink_handlers([{Name, Sink} | RestSinks], GeneratedSinks, Agg) ->
523557 end ;
524558merge_lager_sink_handlers ([], GeneratedSinks , Agg ) -> GeneratedSinks ++ Agg .
525559
526-
527560list_expected_sinks () ->
528561 case application :get_env (rabbit , lager_extra_sinks ) of
529562 {ok , List } ->
@@ -543,6 +576,20 @@ list_expected_sinks() ->
543576 % % module is later cover-compiled, the compile option will
544577 % % be lost, so we will be able to retrieve the list from the
545578 % % application environment.
546- application :set_env (rabbit , lager_extra_sinks , List ),
579+ ok = application :set_env (rabbit , lager_extra_sinks , List ),
547580 List
548581 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