@@ -86,6 +86,10 @@ static struct log_consumer_t default_log_consumers[2] ={
86
86
struct log_consumer_t * log_consumers = default_log_consumers ;
87
87
int log_consumers_no = 2 ;
88
88
89
+ int log_event_enabled = 0 ;
90
+ static str evi_log_name = str_init ("E_CORE_LOG" );
91
+ static event_id_t evi_log_id ;
92
+
89
93
static char * str_fac []= {"LOG_AUTH" ,"LOG_CRON" ,"LOG_DAEMON" ,
90
94
"LOG_KERN" ,"LOG_LOCAL0" ,"LOG_LOCAL1" ,
91
95
"LOG_LOCAL2" ,"LOG_LOCAL3" ,"LOG_LOCAL4" ,"LOG_LOCAL5" ,
@@ -456,6 +460,110 @@ static void syslog_dprint(int log_level, int facility, char *module, const char
456
460
}
457
461
}
458
462
463
+ static str evi_time_str = str_init ("time" );
464
+ static str evi_pid_str = str_init ("pid" );
465
+ static str evi_level_str = str_init ("level" );
466
+ static str evi_module_str = str_init ("module" );
467
+ static str evi_func_str = str_init ("function" );
468
+ static str evi_prefix_str = str_init ("prefix" );
469
+ static str evi_msg_str = str_init ("message" );
470
+
471
+ static void event_dprint (int log_level , int facility , char * module , const char * func ,
472
+ char * format , va_list ap )
473
+ {
474
+ evi_params_p list = NULL ;
475
+ str s ;
476
+ int n ;
477
+ static char in_progress = 0 ;
478
+
479
+ /* prevent reentry from the same process */
480
+ if (in_progress )
481
+ return ;
482
+
483
+ in_progress = 1 ;
484
+
485
+ if (!evi_probe_event (evi_log_id )) {
486
+ in_progress = 0 ;
487
+ return ;
488
+ }
489
+
490
+ if (!(list = evi_get_params ())) {
491
+ in_progress = 0 ;
492
+ return ;
493
+ }
494
+
495
+ init_str (& s , dp_time ());
496
+ if (evi_param_add_str (list , & evi_time_str , & s )) {
497
+ stderr_dprint_tmp ("error: unable to add event parameter\n" );
498
+ goto end_free ;
499
+ }
500
+ n = dp_my_pid ();
501
+ if (evi_param_add_int (list , & evi_pid_str , & n )) {
502
+ stderr_dprint_tmp ("error: unable to add event parameter\n" );
503
+ goto end_free ;
504
+ }
505
+ init_str (& s , dp_log_level_str (log_level ));
506
+ if (evi_param_add_str (list , & evi_level_str , & s )) {
507
+ stderr_dprint_tmp ("error: unable to add event parameter\n" );
508
+ goto end_free ;
509
+ }
510
+
511
+ if (module && func ) {
512
+ init_str (& s , module );
513
+ if (evi_param_add_str (list , & evi_module_str , & s )) {
514
+ stderr_dprint_tmp ("error: unable to add event parameter\n" );
515
+ goto end_free ;
516
+ }
517
+ init_str (& s , func );
518
+ if (evi_param_add_str (list , & evi_func_str , & s )) {
519
+ stderr_dprint_tmp ("error: unable to add event parameter\n" );
520
+ goto end_free ;
521
+ }
522
+ }
523
+
524
+ init_str (& s , log_prefix );
525
+ if (s .len ) {
526
+ if (evi_param_add_str (list , & evi_prefix_str , & s )) {
527
+ stderr_dprint_tmp ("error: unable to add event parameter\n" );
528
+ goto end_free ;
529
+ }
530
+ }
531
+
532
+ s .len = vsnprintf (log_msg_buf , log_msg_buf_size , format , ap );
533
+ if (s .len < 0 ) {
534
+ stderr_dprint_tmp ("error: vsnprintf() failed!\n" );
535
+ goto end_free ;
536
+ }
537
+ if (s .len >=log_msg_buf_size ) {
538
+ stderr_dprint_tmp ("warning: log message truncated\n" );
539
+ s .len = log_msg_buf_size ;
540
+ }
541
+
542
+ /* try to strip \n from the end of the "message" param */
543
+ if (log_msg_buf [s .len - 1 ] == '\n' ) {
544
+ log_msg_buf [s .len - 1 ] = '\0' ;
545
+ s .len -- ;
546
+ }
547
+
548
+ s .s = log_msg_buf ;
549
+ if (evi_param_add_str (list , & evi_msg_str , & s )) {
550
+ stderr_dprint_tmp ("error: unable to add event parameter\n" );
551
+ goto end_free ;
552
+ }
553
+
554
+ if (evi_raise_event (evi_log_id , list )) {
555
+ stderr_dprint_tmp ("error: unable to raise '%.*s' event\n" ,
556
+ evi_log_name .len , evi_log_name .s );
557
+ }
558
+
559
+ in_progress = 0 ;
560
+
561
+ return ;
562
+ end_free :
563
+ evi_free_params (list );
564
+ in_progress = 0 ;
565
+ }
566
+
459
567
/* generic consumer that registers to the log interface */
460
568
static void gen_consumer_pre_fmt_func (log_print_f gen_print_func , int log_level ,
461
569
int facility , char * module , const char * func ,
@@ -587,6 +695,29 @@ int init_log_cons_shm_table(void)
587
695
return 0 ;
588
696
}
589
697
698
+ int init_log_event_cons (void )
699
+ {
700
+ evi_log_id = evi_publish_event (evi_log_name );
701
+ if (evi_log_id == EVI_ERROR ) {
702
+ LM_ERR ("cannot register '%.*s' event\n" ,
703
+ evi_log_name .len , evi_log_name .s );
704
+ return -1 ;
705
+ }
706
+
707
+ log_msg_buf = pkg_malloc (log_msg_buf_size + 1 );
708
+ if (!log_msg_buf ) {
709
+ LM_ERR ("no pkg memory left\n" );
710
+ return -1 ;
711
+ }
712
+
713
+ if (register_log_consumer (EVENT_CONSUMER_NAME , event_dprint , 0 , 1 ) < 0 ) {
714
+ LM_ERR ("Failed to register 'event' log consumer\n" );
715
+ return -1 ;
716
+ }
717
+
718
+ return 0 ;
719
+ }
720
+
590
721
static struct log_consumer_t * get_log_consumer_by_name (str * name )
591
722
{
592
723
int i ;
@@ -658,6 +789,22 @@ int get_log_consumer_mute_state(str *name, int *state)
658
789
return 0 ;
659
790
}
660
791
792
+ int set_log_event_cons_cfg_state (void )
793
+ {
794
+ if (set_log_consumer_mute_state (& str_init (EVENT_CONSUMER_NAME ),
795
+ !log_event_enabled ) < 0 ) {
796
+ LM_ERR ("Failed to set mute state for event consumer\n" );
797
+ return -1 ;
798
+ }
799
+
800
+ return 0 ;
801
+ }
802
+
803
+ void distroy_log_event_cons (void )
804
+ {
805
+ set_log_consumer_mute_state (& str_init (EVENT_CONSUMER_NAME ), 1 );
806
+ }
807
+
661
808
int init_log_level (void )
662
809
{
663
810
log_level = & pt [process_no ].log_level ;
0 commit comments