日誌總結---從common-log、self4j、log4j到logback、logstash

1. log的歷史

log4j --其他日誌                       後來log4j--->logback (與log4j同一作者,性能得到提高,配置更靈活)
    |
   V
common-log接口,自動掃描實現類,有確定,在獨立進程中的類掃描不到
    |
   V
sef4j接口

2.如何打印日誌
log.info("運行錯誤{}",e.getMessage());
log.info("運行錯誤",e);
主要使用上述方式打印日誌時,如果使用%c%L打印類名和行號時,class的名稱顯示的是超類的名字,L顯示的當前類的行號。

3.項目的坑
core-MD居然用到了3種getLoger的方法,有common-logs的,有sellf4j的,有log4j的,所以在排查時遇到一些問題。
多種日誌實現並存時,比如log4j和logback,隨機得到日誌實現。

由於歷史原因,系統有logback、log4j兩套日誌,試着關閉log4j,後發現spring的日誌沒有啦,spring和hibernate等使用了log4j.而習題自動找到了logback的配置。另外如果在spring中沒有配置logback.xml,則maven啓動時使用src/test/resoureces/log_back.xml文件,發佈時使用src/main/resource目錄下的。

在生產機A上,由於多個項目使用了公共lib,所以日誌打印總是有問題,不能上傳到logstash,好像也不能生成文件。
在另外一臺生產機使用獨立lib時時正常。

addActivity屬性:是否還是其他匹配打印日誌。

      比如第一個logger設置了additivity=true,所以除了寫入file_access還會寫入stdout。
     <logger name="com.mindao.app.ea.interceptor.AccessLogInterceptor" level="info" additivity="true">        
        <appender-ref ref="file_access" />
    </logger>

    <logger name="com.mindao" level="info" additivity="false">        
        <appender-ref ref="stdout" />
    </logger>

4.log4j如何對接logstash
 
log4j.rootLogger=INFO,console,socket

# for package com.demo.elk, log would be sent to socket appender.
#log4j.logger.com.mindao.elk=info, socket
log4j.logger.com.mindao.elk=info, socket

# appender socket
log4j.appender.socket=org.apache.log4j.net.SocketAppender
log4j.appender.socket.Port=4567
log4j.appender.socket.RemoteHost=120.76.44.235
log4j.appender.socket.layout=org.apache.log4j.PatternLayout
log4j.appender.socket.layout.ConversionPattern=%d [%-5p] [%l] %m%n
log4j.appender.socket.ReconnectionDelay=10000

# appender console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.out
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d [%-5p] [%l] %m%n

logstash的配置
mkdir config
vi config/log4j_to_es.conf

輸入以下內容:

# For detail structure of this file# Set: https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html
input {
  # For detail config for log4j as input, # See: https://www.elastic.co/guide/en/logstash/current/plugins-inputs-log4j.html
  log4j {
    mode => "server"
    host => "centos2"
    port => 4567
  }
}
filter {
}
output {
  # For detail config for elasticsearch as output, # See: https://www.elastic.co/guide/en/logstash/current/plugins-outputs-elasticsearch.html
  elasticsearch {
    action => "index"#The operation on ES
    hosts  => "centos2:9200"#ElasticSearch host, can be array.
    index  => "applog"#The index to write data to.
  }
}
5 logback如何對接logstash

Including it in your project

Maven style:

<dependency>
  <groupId>net.logstash.logback</groupId>
  <artifactId>logstash-logback-encoder</artifactId>
  <version>4.7</version>
</dependency>

UDP Appender

To output JSON for LoggingEvents to a syslog/UDP channel, use the LogstashSocketAppender in your logback.xml like this:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <appendername="stash"class="net.logstash.logback.appender.LogstashSocketAppender">
    <host>MyAwesomeSyslogServer</host>
    <!-- port is optional (default value shown) -->
    <port>514</port>
  </appender>
  <rootlevel="all">
    <appender-refref="stash" />
  </root>
</configuration>

logstash的配置
input {
  syslog {
    codec => "json"
  }
}









 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章