@@ -418,7 +418,168 @@ logback.xml Example:
418
418
</root>
419
419
</configuration>
420
420
```
421
+ # Kafka transport for logstash-gelf
421
422
423
+
424
+ logstash-gelf can be used together with [ Kafka] ( https://kafka.apache.org/ ) for shipping log events.
425
+
426
+ The URI used as connection property is a java.net.URI. The minimal URI must contain at least a host and
427
+ the Fragment (Topic Name).
428
+ The URL allows to specify one or more brokers but in this case you must define ports inside URL.
429
+
430
+ kafka://broker[:port]?[producer_properties]#[log-topic]
431
+
432
+ Example:
433
+
434
+ kafka://localhost#topic-log
435
+ kafka://localhost:9092#topic-log
436
+ kafka://localhost:9092,localhost:9093,localhost:9094#topic-log
437
+ kafka://localhost?acks=all#topic-log
438
+ kafka://localhost:19092?acks=1&max.block.ms=1000&transaction.timeout.ms=1000&request.timeout.ms=1000#kafka-log-topic
439
+
440
+ * scheme (fixed: Kafka, directly used to determine the to be used sender class)
441
+ * host (variable: the host your Kafka broker runs on)
442
+ * port (variable: the port your Kafka broker runs on)
443
+ * query (variable: kafka producer config properties which is usually defined inside producer.properties file)
444
+ * fragment (variable: the topic we send log messages on)
445
+
446
+ Sample log4J2 configuration:
447
+ ``` xml
448
+ <Configuration packages =" biz.paluch.logging.gelf.log4j2" >
449
+ <Appenders >
450
+ <Gelf name =" gelf" host =" kafka://localhost#kafka-log-topic" port =" 9093" version =" 1.1" extractStackTrace =" true"
451
+ filterStackTrace =" true" mdcProfiling =" true" includeFullMdc =" true" maximumMessageSize =" 8192"
452
+ originHost =" %host{fqdn}" additionalFieldTypes =" fieldName1=String,fieldName2=Double,fieldName3=Long" >
453
+ <Field name =" timestamp" pattern =" %d{dd MMM yyyy HH:mm:ss,SSS}" />
454
+ <Field name =" level" pattern =" %level" />
455
+ <Field name =" simpleClassName" pattern =" %C{1}" />
456
+ <Field name =" className" pattern =" %C" />
457
+ <Field name =" server" pattern =" %host" />
458
+ <Field name =" server.fqdn" pattern =" %host{fqdn}" />
459
+
460
+
461
+ <!-- This is a static field -->
462
+ <Field name =" fieldName2" literal =" fieldValue2" />
463
+
464
+ <!-- This is a field using MDC -->
465
+ <Field name =" mdcField2" mdc =" mdcField2" />
466
+ <DynamicMdcFields regex =" mdc.*" />
467
+ <DynamicMdcFields regex =" (mdc|MDC)fields" />
468
+ </Gelf >
469
+ <Console name =" Console" target =" SYSTEM_OUT" >
470
+ <PatternLayout pattern =" %d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
471
+ </Console >
472
+ </Appenders >
473
+ <Loggers >
474
+ <Root level =" INFO" >
475
+ <AppenderRef ref =" gelf" />
476
+ <AppenderRef ref =" Console" />
477
+ </Root >
478
+ </Loggers >
479
+ </Configuration >
480
+ ```
481
+ Sample spring logback configuration:
482
+ ``` xml
483
+ <!DOCTYPE configuration >
484
+
485
+ <configuration >
486
+ <include resource =" org/springframework/boot/logging/logback/base.xml" />
487
+ <contextName >test</contextName >
488
+ <jmxConfigurator />
489
+ <appender name =" STDOUT" class =" ch.qos.logback.core.ConsoleAppender" >
490
+ <encoder class =" ch.qos.logback.classic.encoder.PatternLayoutEncoder" >
491
+ <pattern >
492
+ %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
493
+ </pattern >
494
+ </encoder >
495
+ </appender >
496
+ <appender name =" gelfUdp" class =" biz.paluch.logging.gelf.logback.GelfLogbackAppender" >
497
+ <host >udp:localhost</host >
498
+ <port >12201</port >
499
+ <version >1.1</version >
500
+ <facility >java-test</facility >
501
+ <extractStackTrace >true</extractStackTrace >
502
+ <filterStackTrace >true</filterStackTrace >
503
+ <mdcProfiling >false</mdcProfiling >
504
+ <timestampPattern >yyyy-MM-dd HH:mm:ss,SSS</timestampPattern >
505
+ <maximumMessageSize >8192</maximumMessageSize >
506
+ <!-- This are static fields -->
507
+ <additionalFields >fieldName1=fieldValue1,fieldName2=fieldValue2</additionalFields >
508
+ <!-- Optional: Specify field types -->
509
+ <additionalFieldTypes >fieldName1=String,fieldName2=Double,fieldName3=Long</additionalFieldTypes >
510
+
511
+ <!-- This are fields using MDC -->
512
+ <mdcFields >mdcField1,mdcField2</mdcFields >
513
+ <dynamicMdcFields >mdc.*,(mdc|MDC)fields</dynamicMdcFields >
514
+ <includeFullMdc >true</includeFullMdc >
515
+ <filter class =" ch.qos.logback.classic.filter.ThresholdFilter" >
516
+ <level >ALL</level >
517
+ </filter >
518
+ </appender >
519
+
520
+ <appender name =" gelfKafka" class =" biz.paluch.logging.gelf.logback.GelfLogbackAppender" >
521
+ <host >kafka://localhost:9092?acks=all& max.block.ms=1000& transaction.timeout.ms=1000& request.timeout.ms=1000#kafka-log-topic</host >
522
+ <port ></port >
523
+ <version >1.1</version >
524
+ <facility >java-test</facility >
525
+ <extractStackTrace >true</extractStackTrace >
526
+ <filterStackTrace >true</filterStackTrace >
527
+ <mdcProfiling >false</mdcProfiling >
528
+ <timestampPattern >yyyy-MM-dd HH:mm:ss,SSS</timestampPattern >
529
+ <maximumMessageSize >8192</maximumMessageSize >
530
+
531
+ <!-- This are static fields -->
532
+ <additionalFields >fieldName1=fieldValue1,fieldName2=fieldValue2</additionalFields >
533
+ <!-- Optional: Specify field types -->
534
+ <additionalFieldTypes >fieldName1=String,fieldName2=Double,fieldName3=Long</additionalFieldTypes >
535
+
536
+ <!-- This are fields using MDC -->
537
+ <mdcFields >mdcField1,mdcField2</mdcFields >
538
+ <dynamicMdcFields >mdc.*,(mdc|MDC)fields</dynamicMdcFields >
539
+ <includeFullMdc >true</includeFullMdc >
540
+ <filter class =" ch.qos.logback.classic.filter.ThresholdFilter" >
541
+ <level >INFO</level >
542
+ </filter >
543
+ </appender >
544
+
545
+ <root level =" INFO" >
546
+ <appender-ref ref =" gelfKafka" />
547
+ </root >
548
+ <logger name =" org.apache.kafka" level =" ALL" additivity =" false" >
549
+ <appender-ref ref =" gelfUdp" />
550
+ <appender-ref ref =" STDOUT" />
551
+ </logger >
552
+ <logger name =" javax.management" level =" ALL" additivity =" false" >
553
+ <appender-ref ref =" gelfUdp" />
554
+ <appender-ref ref =" STDOUT" />
555
+ </logger >
556
+ </configuration >
557
+ ```
558
+ ** Limitations**
559
+
560
+ Some configurations will be overridden or set by default:
561
+ - acks (If you set it to 0 it will be set to 1 by default for log message acknowledgements) defaultValue = all
562
+ - retries defaultValue=2
563
+ - value.serializer ByteArraySerializer (will always override)
564
+ - key.serializer ByteArraySerializer (will always override)
565
+
566
+ ** When using with SL4J/Logback/Spring:**
567
+
568
+ When you are using logback/sl4j/spring you must not use kafka sender for loggers of ` org.apache.kafka ` and ` javax.management `
569
+ packages this will create a cyclic dependency for [ KafkaProducer] ( https://kafka.apache.org/20/javadoc/index.html?org/apache/kafka/clients/producer/KafkaProducer.html ) which is also using loggers from these package.
570
+ You can use other logstash-gelf appender such as UDP or TCP to log these logs to Graylog.
571
+
572
+ You can set these loggers by changing appender-ref this way:
573
+ ``` xml
574
+ <logger name =" org.apache.kafka" level =" ALL" additivity =" false" >
575
+ <appender-ref ref =" gelfUdp" />
576
+ <appender-ref ref =" STDOUT" />
577
+ </logger >
578
+ <logger name =" javax.management" level =" ALL" additivity =" false" >
579
+ <appender-ref ref =" gelfUdp" />
580
+ <appender-ref ref =" STDOUT" />
581
+ </logger >
582
+ ```
422
583
Versions/Dependencies
423
584
---------------------
424
585
This project is built against following dependencies/versions:
@@ -427,8 +588,9 @@ This project is built against following dependencies/versions:
427
588
* log4j2 2.9.1
428
589
* Java Util Logging JDK Version 1.6
429
590
* logback 1.1.3
430
- * slf4j-api 1.7.13
591
+ * slf4j-api 1.7.25
431
592
* jedis 2.9.0 (includes commons-pool2 2.4.3)
593
+ * kafka-clients 2.1.0
432
594
433
595
License
434
596
-------
0 commit comments