Log4j2遠程日誌

遠程管理日誌

  • 可以集中管理日誌:可以把多臺服務器上的日誌都發送到一臺日誌服務器上,方便管理、查看和分析(或者通過Logstash上傳到elasticsearch中)
  • 可以減輕服務器的開銷:日誌不在服務器上了,因此服務器有更多可用的磁盤空間
  • 可以提高服務器的性能:通過異步方式,記錄日誌時服務器只負責發送消息,不關心日誌記錄的時間和位置,服務器甚至不關心日誌到底有沒有記錄成功

在這裏插入圖片描述

常見的日誌工具

  • log4j是apache實現的一個開源日誌組件
  • logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日誌框架,是slf4j的原生實現
  • Log4j2是log4j 1.x和logback的改進版,據說採用了一些新技術(無鎖異步、等等),使得日誌的吞吐量、性能比log4j
    1.x提高10倍,並解決了一些死鎖的bug,而且配置更加簡單靈活

第一步:springboot使用log4j2需要添加以下架包

<!--除去springboot自帶的日誌-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter</artifactId>
   <exclusions>
       <exclusion>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-logging</artifactId>
       </exclusion>
   </exclusions>
</dependency>

<!--添加log4j2的依賴-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

第二步:加載log4j2配置的文件的方式有以下幾種

1.純java的方式

public static void main(String[] args) throws IOException {  
   File file = new File("D:/log4j2.xml");  
   BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));  
   final ConfigurationSource source = new ConfigurationSource(in);  
   Configurator.initialize(null, source);  
   Logger logger = LogManager.getLogger("myLogger");  
}

2.spring web的方式

<context-param>  
   <param-name>log4jConfiguration</param-name>  
   <param-value>/WEB-INF/conf/log4j2.xml</param-value>  
</context-param>  
<listener>  
   <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>  
</listener>

3.spring boot的方式
application.properties中添加配置

logging.config=classpath:log4j2_dev.xml

log4j2_dev.xml是你創建的log4j2的配置文件名,放在resources下,如放在其他路徑則對應修改。

第三步:配置log4j2_dev.xml(本地)

<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<configuration status="WARN" monitorInterval="1800">
   <Properties>
       <!-- =================公共配置========================= -->
       <!-- 設置日誌文件的目錄名稱 -->
       <property name="logFileName">qfxLog4jDemoLog</property>
       <!-- 日誌默認存放的位置,可以設置爲項目根路徑下,也可指定絕對路徑 -->
       <!-- 存放路徑一:通用路徑,window平臺 -->
         <property name="basePath">d:/logs/${logFileName}</property>
       <!-- 存放路徑二:web工程專用,java項目沒有這個變量,需要刪掉,否則會報異常,這裏把日誌放在web項目的根目錄下 -->
       <!-- <property name="basePath">${web:rootDir}/${logFileName}</property> -->
       <!-- 存放路徑三:web工程專用,java項目沒有這個變量,需要刪掉,否則會報異常,這裏把日誌放在tocmat的logs目錄下 -->
      <!--<property name="basePath">${sys:catalina.home}/logs/${logFileName}</property>-->


       <!-- 控制檯默認輸出格式,"%-5level":日誌級別,"%l":輸出完整的錯誤位置,是小寫的L,因爲有行號顯示,所以影響日誌輸出的性能 -->
       <property name="console_log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %l - %m%n</property>
       <!-- 日誌文件默認輸出格式,不帶行號輸出(行號顯示會影響日誌輸出性能);%C:大寫,類名;%M:方法名;%m:錯誤信息;%n:換行 -->
       <!-- <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M - %m%n</property> -->
       <!-- 日誌文件默認輸出格式,另類帶行號輸出(對日誌輸出性能未知);%C:大寫,類名;%M:方法名;%L:行號;%m:錯誤信息;%n:換行 -->
       <property name="log_pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %C.%M[%L line] - %m%n</property>


       <!-- 日誌默認切割的最小單位 -->
       <property name="every_file_size">20MB</property>
       <!-- 日誌默認輸出級別 -->
       <property name="output_log_level">DEBUG</property>


       <!-- ==================所有級別日誌配置======================= -->
       <!-- 日誌默認存放路徑(所有級別日誌) -->
       <property name="rolling_fileName">${basePath}/all.log</property>
       <!-- 日誌默認壓縮路徑,將超過指定文件大小的日誌,自動存入按"年月"建立的文件夾下面並進行壓縮,作爲存檔 -->
       <property name="rolling_filePattern">${basePath}/%d{yyyy-MM}/all-%d{yyyy-MM-dd-HH}-%i.log.gz</property>
       <!-- 日誌默認同類型日誌,同一文件夾下可以存放的數量,不設置此屬性則默認爲7個,filePattern最後要帶%i纔會生效 -->
       <property name="rolling_max">500</property>
       <!-- 日誌默認同類型日誌,多久生成一個新的日誌文件,這個配置需要和filePattern結合使用;
               如果設置爲1,filePattern是%d{yyyy-MM-dd}到天的格式,則間隔一天生成一個文件
               如果設置爲12,filePattern是%d{yyyy-MM-dd-HH}到小時的格式,則間隔12小時生成一個文件 -->
       <property name="rolling_timeInterval">12</property>
       <!-- 日誌默認同類型日誌,是否對封存時間進行調製,若爲true,則封存時間將以0點爲邊界進行調整,
               如:現在是早上3am,interval是4,那麼第一次滾動是在4am,接着是8am,12am...而不是7am -->    
       <property name="rolling_timeModulate">true</property>


       <!--=================Info級別日誌====================== -->
       <!-- Info日誌默認存放路徑(Info級別日誌) -->
       <property name="info_fileName">${basePath}/info.log</property>
       <!-- Info日誌默認壓縮路徑,將超過指定文件大小的日誌,自動存入按"年月"建立的文件夾下面並進行壓縮,作爲存檔 -->
       <property name="info_filePattern">${basePath}/%d{yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log.gz</property>
       <!-- Info日誌默認同一文件夾下可以存放的數量,不設置此屬性則默認爲7個 -->
       <property name="info_max">100</property>
       <!-- 日誌默認同類型日誌,多久生成一個新的日誌文件,這個配置需要和filePattern結合使用;
               如果設置爲1,filePattern是%d{yyyy-MM-dd}到天的格式,則間隔一天生成一個文件
               如果設置爲12,filePattern是%d{yyyy-MM-dd-HH}到小時的格式,則間隔12小時生成一個文件 -->
       <property name="info_timeInterval">1</property>
       <!-- 日誌默認同類型日誌,是否對封存時間進行調製,若爲true,則封存時間將以0點爲邊界進行調整,
               如:現在是早上3am,interval是4,那麼第一次滾動是在4am,接着是8am,12am...而不是7am -->    
       <property name="info_timeModulate">true</property>


       <!--===============Warn級別日誌====================-->
       <!-- Warn日誌默認存放路徑(Warn級別日誌) -->
       <property name="warn_fileName">${basePath}/warn.log</property>
       <!-- Warn日誌默認壓縮路徑,將超過指定文件大小的日誌,自動存入按"年月"建立的文件夾下面並進行壓縮,作爲存檔 -->
       <property name="warn_filePattern">${basePath}/%d{yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log.gz</property>
       <!-- Warn日誌默認同一文件夾下可以存放的數量,不設置此屬性則默認爲7個 -->
       <property name="warn_max">100</property>
       <!-- 日誌默認同類型日誌,多久生成一個新的日誌文件,這個配置需要和filePattern結合使用;
               如果設置爲1,filePattern是%d{yyyy-MM-dd}到天的格式,則間隔一天生成一個文件
               如果設置爲12,filePattern是%d{yyyy-MM-dd-HH}到小時的格式,則間隔12小時生成一個文件 -->
       <property name="warn_timeInterval">1</property>
       <!-- 日誌默認同類型日誌,是否對封存時間進行調製,若爲true,則封存時間將以0點爲邊界進行調整,
               如:現在是早上3am,interval是4,那麼第一次滾動是在4am,接着是8am,12am...而不是7am -->    
       <property name="warn_timeModulate">true</property>


       <!--======================Error級別日誌====================== -->
       <!-- Error日誌默認存放路徑(Error級別日誌) -->
       <property name="error_fileName">${basePath}/error.log</property>
       <!-- Error日誌默認壓縮路徑,將超過指定文件大小的日誌,自動存入按"年月"建立的文件夾下面並進行壓縮,作爲存檔 -->
       <property name="error_filePattern">${basePath}/%d{yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log.gz</property>
       <!-- Error日誌默認同一文件夾下可以存放的數量,不設置此屬性則默認爲7個 -->
       <property name="error_max">100</property>
       <!-- 日誌默認同類型日誌,多久生成一個新的日誌文件,這個配置需要和filePattern結合使用;
               如果設置爲1,filePattern是%d{yyyy-MM-dd}到天的格式,則間隔一天生成一個文件
               如果設置爲12,filePattern是%d{yyyy-MM-dd-HH}到小時的格式,則間隔12小時生成一個文件 -->
       <property name="error_timeInterval">1</property>
       <!-- 日誌默認同類型日誌,是否對封存時間進行調製,若爲true,則封存時間將以0點爲邊界進行調整,
               如:現在是早上3am,interval是4,那麼第一次滾動是在4am,接着是8am,12am...而不是7am -->    
       <property name="error_timeModulate">true</property>


       <!-- ==================控制檯顯示控制====================== -->
       <!-- 控制檯顯示的日誌最低級別 -->
       <property name="console_print_level">DEBUG</property>


   </Properties>
   <!--定義appender  即多個輸出源 -->
   <appenders>
       <!-- ================用來定義輸出到控制檯的配置===================== -->
       <Console name="Console" target="SYSTEM_OUT">
           <!-- 設置控制檯只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
           <ThresholdFilter level="${console_print_level}" onMatch="ACCEPT" onMismatch="DENY"/>
           <!-- 設置輸出格式,不設置默認爲:%m%n -->
           <PatternLayout pattern="${console_log_pattern}"/>
       </Console>


       <!-- =============打印root中指定的level級別以上的日誌到文件=================-->
       <RollingFile name="RollingFile" fileName="${rolling_fileName}" filePattern="${rolling_filePattern}">
           <PatternLayout pattern="${log_pattern}"/>
           <Policies>
               <TimeBasedTriggeringPolicy interval="${rolling_timeInterval}" modulate="${warn_timeModulate}"/>
               <SizeBasedTriggeringPolicy size="${every_file_size}"/>
           </Policies>
           <!-- 設置同類型日誌,同一文件夾下可以存放的數量,如果不設置此屬性則默認存放7個文件 -->
           <DefaultRolloverStrategy max="${rolling_max}" />
       </RollingFile>


       <!-- ================打印INFO級別的日誌到文件=================== -->
       <RollingFile name="InfoFile" fileName="${info_fileName}" filePattern="${info_filePattern}">
           <PatternLayout pattern="${log_pattern}"/>
           <Policies>
               <TimeBasedTriggeringPolicy interval="${info_timeInterval}" modulate="${info_timeModulate}"/>
               <SizeBasedTriggeringPolicy size="${every_file_size}"/>
           </Policies>
           <DefaultRolloverStrategy max="${info_max}" />
           <Filters>
               <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>  
               <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
           </Filters>
       </RollingFile>


       <!-- ========================打印WARN級別的日誌到文件===================== -->
       <RollingFile name="WarnFile" fileName="${warn_fileName}" filePattern="${warn_filePattern}">
           <PatternLayout pattern="${log_pattern}"/>
           <Policies>
               <TimeBasedTriggeringPolicy interval="${warn_timeInterval}" modulate="${warn_timeModulate}"/>
               <SizeBasedTriggeringPolicy size="${every_file_size}"/>
           </Policies>
           <DefaultRolloverStrategy max="${warn_max}" />
           <Filters>
               <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>  
               <ThresholdFilter level="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
           </Filters>
       </RollingFile>


       <!-- ===================打印ERROR級別的日誌到文=================== -->
       <RollingFile name="ErrorFile" fileName="${error_fileName}" filePattern="${error_filePattern}">
           <PatternLayout pattern="${log_pattern}"/>
           <Policies>
               <TimeBasedTriggeringPolicy interval="${error_timeInterval}" modulate="${error_timeModulate}"/>
               <SizeBasedTriggeringPolicy size="${every_file_size}"/>
           </Policies>
           <DefaultRolloverStrategy max="${error_max}" />
           <Filters>
               <ThresholdFilter level="FATAL" onMatch="DENY" onMismatch="NEUTRAL"/>  
               <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
           </Filters>
       </RollingFile>
      <Socket name="logstash-tcp" host="47.94.101.75" port="4560" protocol="TCP">
       <PatternLayout pattern="${log_pattern}"/>
      </Socket>
   </appenders>
   <!--定義logger,只有定義了logger並引入的appender,appender纔會生效-->
   <loggers>
       <!-- 設置打印sql語句配置開始,以下兩者配合使用,可以優化日誌的輸出信息,減少一些不必要信息的輸出 -->
       <!-- 設置java.sql包下的日誌只打印DEBUG及以上級別的日誌,此設置可以支持sql語句的日誌打印 -->
       <logger name="java.sql" level="DEBUG" additivity="false">
           <appender-ref ref="Console"/>
       </logger>
       <!-- 設置org.mybatis.spring包下的日誌只打印WARN及以上級別的日誌 -->
       <logger name="org.mybatis.spring" level="WARN" additivity="false">
           <appender-ref ref="Console"/>
       </logger>
       <!-- 設置org.mybatis.spring包下的日誌只打印WARN及以上級別的日誌 -->
       <logger name="org.springframework" level="WARN" additivity="false">
           <appender-ref ref="Console"/>
       </logger>
       <!-- 設置org.mybatis.spring包下的日誌只打印WARN及以上級別的日誌 -->
       <logger name="com.qfx.workflow.service" level="WARN" additivity="false">
           <appender-ref ref="Console"/>
       </logger>
       <!-- 設置打印sql語句配置結束 -->


       <!--建立一個默認的root的logger-->
       <root level="${output_log_level}">
           <appender-ref ref="RollingFile"/>
           <appender-ref ref="Console"/>
           <appender-ref ref="InfoFile"/>
           <appender-ref ref="WarnFile"/>
           <appender-ref ref="ErrorFile"/>
           <appender-ref ref="logstash-tcp"/>
       </root>
   </loggers>


</configuration>
  • Configuration:爲根節點,有status和monitorInterval等多個屬性
  • Appenders:輸出源,用於定義日誌輸出的地方log4j2支持的輸出源有很多,有控制檯Console、文件File、RollingRandomAccessFile、MongoDB、Flume等
  • Loggers:日誌器 ,日誌器分根日誌器Root和自定義日誌器,當根據日誌名字獲取不到指定的日誌器時就使用Root作爲默認的日誌器

第四步:配置到外部服務器

https://blog.csdn.net/gotofind/article/details/79465998
log4j向遠程發送日誌是通過SocketAppender,一個基於socket的Appender程序(TCP協議通信),它不會對日誌消息做任何的處理,僅僅是通過socket將日誌發送到特定的服務器上。在SocketAppender中,只是簡單的把LoggingEvent所直接對象通過序列化的方式發送到套接字的輸出流上。

TCP的方式

<Socket name="logstash-tcp" host="127.0.0.1" port="4560" protocol="TCP">
   <PatternLayout pattern="${LOG_PATTERN}"/>
</Socket>

UDP的方式

<Socket name="logstash-udp" host="127.0.0.1" port="4560" protocol="UDP">
       <PatternLayout pattern="${LOG_PATTERN}"/>
</Socket>

配置

<?xml version="1.0" encoding="UTF-8"?>
<!--日誌級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration後面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<configuration status="WARN" monitorInterval="1800">
    <Properties>
        <Property name="LOG_PATTERN">{"logger": "%logger", "level": "%level", "msg": "%message"}%n</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>
        <Socket name="logstash-tcp" host="127.0.0.1" port="4560" protocol="TCP">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Socket>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="logstash-tcp" />
        </Root>
    </Loggers>
</configuration>

logstash中接收log4j2

  • 舊的版本logstash中使用log4j來獲取日誌文件
  • 新的版本使用udp或者tcp
  • 新版本也可以通過安裝filebeat,使用beats來獲取
input{
udp {
host=>"localhost"
port=>4560
}
}
filter {
        mutate {
                split => ["upstreamtime", ","]    
        }
        mutate {
                convert => ["upstreamtime", "float"]
        }
}
output{
        elasticsearch {
                hosts => ["127.0.0.1:9200"]   #elasticsearch地址
                index => "mylogs"   #索引
                workers => 1
                template_overwrite => true   
        }
}

在這裏插入圖片描述

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