天天看點

log4j2+logstash+elasticsearch+kibana實作分布式日志收集系統!最快上手!logstash+elasticsearch+kibana分布式叢集日志收集系統

logstash+elasticsearch+kibana分布式叢集日志收集系統

GITHUB位址!

logstash+elasticsearch+kibana分布式叢集日志收集系統,超級詳細!最快上手!

名稱 版本
kibana 5.6.8
elasticsearch 5.6.8
kafka 2.11-1.0.0
logstash 6.2.3

啟動kafka,建立topic

  • cd kafka解壓後的目錄内
  • 運作bin/zookeeper-server-start.sh config/zookeeper.properties &
  • 運作bin/kafka-server-start.sh config/server.properties &
  • 建立topic

    bin/kafka-topics.sh --create --zookeeper localhost:2181 --topic 你的topic名稱 --partirion 1 --replication-factor 1

  • 檢查topic

    bin/kafka-topics.sh --describe --zookeeper localhost:2181 --topic 你的topic名稱

配置log4j2,搭建項目

  • 配置maven依賴
    <dependency>    
        <groupId>org.springframework.boot</groupId>    
        <artifactId>spring-boot-starter</artifactId>    
        <!-- 去除springboot自帶的日志 -->       
        <exclusions>        
        	<exclusion>            
        	<groupId>org.springframework.boot</groupId>            
        	<artifactId>spring-boot-starter-logging</artifactId>        
        	</exclusion>    
      	</exclusions>
    </dependency>
    <dependency>    
    	<groupId>org.springframework.boot</groupId>   
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
               
  • 建立日志測試類
    @RestController
    @RequestMapping("/api")
    public class DemoController {
    	
    	private static Logger logger = LoggerFactory.getLogger(DemoApplication.class);
    	
    	@RequestMapping("/hello")
    	public void hello() throws Exception {
    		logger.info("invoke hello!");
    		throw new Exception("test invoke hello occur exception");
    	}
    	
    }
               
  • 配置log4j2
    • application.yml
      server.port=8800
      logging.config=classpath:log4j-spring-kafka.xml
                 
    • 建立log4j-spring-kafka.xml
      <?xml version="1.0" encoding="UTF-8"?>
      <!--日志級别以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
      <Configuration status="OFF">
          <Appenders>
              <!-- 輸出控制台日志的配置 -->
              <Console name="console" target="SYSTEM_OUT">
                  <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
                  <!-- 輸出日志的格式 -->
                  <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-5level %logger{36} - %msg%n"/>
              </Console>
              <Kafka name="Kafka" topic="你的伺服器收集日志的topic名稱">
                  <PatternLayout pattern="%date %message"/>
                  <Property name="bootstrap.servers">kafka伺服器ip:kafka監聽端口</Property>
              </Kafka>
          </Appenders>
      
          <Loggers>
              <Root level="ALL">
                  <AppenderRef ref="Kafka"/>
                  <AppenderRef ref="console"/>
              </Root>
              <Logger name="org.apache.kafka" level="INFO"/>
              <logger name="org.springframework" level="INFO"/>
          </Loggers>
      </Configuration>
                 
  • 伺服器執行下面的指令消費指定topic,kafka
    bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic serverlogs  --from-beginning
               
  • 啟動項目,此時應該可以看到kafka已經列印出來了啟動日志!

安裝logstash,elasticsearch,kibana

  • 網上教程極多,就不介紹如何安裝qaq
  • 由于自己的機子是2g的記憶體,是以說用的滿滿當當,這幾個元件都挺能搶記憶體的,elasticsearch預設就要2g記憶體…個人最終是elasticsearch(400m)+logstash(400m)+其他,這個注意調整不然申請記憶體不夠必報錯
  • 安裝的時候基本的錯誤基本都能看到錯誤描述,也好解決
    • 配置檔案格式錯
    • 擴充辨別符數量ulimit -Hn 66666
    • 配置設定權限 chmod -R 777 檔案夾
    • elasticsearch不能在root使用者下運作,要建立使用者newuser,然後 su newuser,拷貝安裝包到/usr目錄下cd到指定目錄啟動elasticsearch
  • 系統架構圖
    log4j2+logstash+elasticsearch+kibana實作分布式日志收集系統!最快上手!logstash+elasticsearch+kibana分布式叢集日志收集系統
  • logstash配置檔案
    input {
        kafka {
            bootstrap_servers => ["你的kafka伺服器位址:9092"]
            topics => ["serverlogs"]
    	type => "log4j-json"
        }
    }
    output {
        stdout {
          codec => rubydebug
        }
        elasticsearch {
            hosts => ["你的elasticsearch伺服器位址:9200"]
            index => "applogstash-%{+YYYY.MM.dd.HH}"
        }
    }
               

效果展示

本地啟動項目

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-8SJQeXiw-1590910536343)(http://118.31.11.163:6868/files/image-20200530235326592.png)]

Management裡填寫 applogstash-* 就可以看到日志!(不要勾選@timestamp!)

[外鍊圖檔轉存失敗,源站可能有防盜鍊機制,建議将圖檔儲存下來直接上傳(img-x9arg8op-1590910536344)(http://118.31.11.163:6868/files/image-20200530235207128.png)]

TODO list

  • 加上過濾器,把資料标準格式化
  • 能不能把nginx日志配置到裡面,也不難,讀取file就可以
  • 叢集化,其實就是幾個zk互相注冊,幾個kafka提供消息服務,配置好ip和參數就可以
  • 內建到已有項目,盡量無侵入

更新

  • logstash配置檔案
    input {
        kafka {
            bootstrap_servers => ["你的kafka伺服器位址:9092"]
            topics => ["serverlogs"]
            type => "json"
        }
    }
    filter {
        grok {
            patterns_dir => ["/root/logstash-6.2.3/patterns"]
            match => {
                "message" => "%{TIMESTAMP_ISO8601:timestamp}\[%{MY_THREAD:threadname}\]\s%{LOGLEVEL:loglevel}\s\s\[%{MY_METHOD:method}\]\s-\s%{MY_MSG:information}"
            }
        }
    }
    output {
        stdout {
          codec => rubydebug
        }
        elasticsearch {
            hosts => ["你的elasticsearch伺服器位址:9200"]
            index => "applogstash-%{+YYYY.MM.dd.HH}"
        }
    }
               
  • log4j2配置
    <Kafka name="Kafka" topic="serverlogs">
                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS}[%t] %-5level [%l] - %msg"/>
                <Property name="bootstrap.servers">你的kafka伺服器位址:9092</Property>
            </Kafka>