log4j2配置文件

項目裏面常常用到日誌,Java開發通常用log4j、slf4j這些框架,看着配置文件有點懵。這幾天看公司代碼的時候,也有用到log4j,感受要複雜一點。在本地打log,也有打到hive裏面存的。看了一下公司日誌的組件架構,有兩種方式。spring

一種打到服務器本地,經過agent收集到hive,kafka等組件,供日誌中心、服務管理中心、storm等組件消費。apache

一種經過rpc服務打到本地agent,在經過agent上報到遠程服務器,看了源碼,是擴展了log4j框架。log4j支持這種擴展,繼承一些框架的類。spring也支持這種擴展,不少公司也在使用這種擴展。好比,spring2.0開始支持schema的擴展,在dubbo中也用到了,封裝了本身的xml標識。api

這裏貼一個我寫的log4j demo服務器

maven依賴架構

<dependencies>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.8.0-beta2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.11.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.11.1</version>
        </dependency>
    </dependencies>

測試類app

public class HelloSlf4j {
    public static void main(String[] args) {
        for(int i = 0; i < 10; i++){
            Logger logger = LoggerFactory.getLogger(HelloSlf4j.class);
            logger.debug("Hello Slf4j");
        }
    }
}

配置框架

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
        <File name="MyFile" fileName="all.log" immediateFlush="false" append="false">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
        <File name="MyFile1" fileName="all1.log" immediateFlush="false" append="true">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>
        <File name="async" fileName="async.log" immediateFlush="false" append="true">
            <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>

        <Async name="scribeAsyncAppender" errorRef="async" bufferSize="102400" blocking="false">
            <AppenderRef ref="async"/>
        </Async>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <!--<AppenderRef ref="Console" />-->
            <AppenderRef ref="MyFile"/>
            <AppenderRef ref="scribeAsyncAppender"/>
        </Root>
        <Logger name="com.gxf.slf4j.HelloSlf4j" level="debug">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="MyFile1"/>
        </Logger>
    </Loggers>
</Configuration>

這裏主要須要理清楚幾個組件之間的關係,Root、Logger、Appenderasync

Root相似於一個父類的Logger,全部的logger都繼承他的屬性,logger自定義的屬性會覆蓋掉父類log配置maven

Logger對外提供使用接口,如log.info()等方法。能夠有多個Appender測試

Appender是往控制檯、文件中寫內容的組件

相關文章
相關標籤/搜索