前言
- log4j是apache實現的一個開源日志組件
- logback同樣是由log4j的作者設計完成的,擁有更好的特性,用來取代log4j的一個日志框架,是slf4j的原生實現
- log4j2是log4j 1.x和logback的改進版,據說采用了一些新技術(無鎖異步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,並解決了一些死鎖的bug,而且配置更加簡單靈活
slf4j是對所有日志框架制定的一種規范、標准、接口,並不是一個框架的具體的實現,因為接口並不能獨立使用,需要和具體的日志框架實現配合使用(如log4j、logback),使用接口的好處是當項目需要更換日志框架的時候,只需要更換jar和配置,不需要更改相關java代碼
log4j、logback、log4j2都是一種日志具體實現框架,所以既可以單獨使用也可以結合slf4j一起搭配使用。
使用Log4j2
- 在pom文件中排除掉spring-boot-starter-web下的spring-boot-starter-logging依賴,並添加log4j2依賴,如下:
<!--排除依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <artifactId>spring-boot-starter-logging</artifactId> <groupId>org.springframework.boot</groupId> </exclusion> </exclusions> </dependency> <!--添加依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
- 在resources新增log4j2.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出,默認是OFF--> <!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數--> <configuration status="WARN" monitorInterval="30"> <Properties> <!--自定義一些常量,之后使用${變量名}引用--> <Property name="logFilePath">./applogs</Property> </Properties> <!--定義所有的appender--> <!--appenders:定義輸出內容,輸出格式,輸出方式,日志保存策略等,常用其下三種標簽[console,File,RollingFile]--> <appenders> <!--console :控制台輸出的配置--> <console name="Console" target="SYSTEM_OUT"> <!--設置控制台打印級別--> <ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/> <!--PatternLayout :輸出日志的格式,LOG4J2定義了輸出代碼,詳細解釋見下文--> <!--<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss} [%t] %-5level %logger{36} %M [%L] - %msg%n"/>--> <!--<PatternLayout pattern="%d{YYYY-MM-dd HH:mm:ss.SSS} %-5p %processId --- [%t] - %logger - %m%n"/>--> <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %-40.40logger{39} - %m%n"/> </console> <!--File :同步輸出日志到本地文件--> <!--append="false":這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用--> <File name="log" fileName="${logFilePath}/log_all.log" append="false"> <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/> </File> <!--SMTP :郵件發送日志--> <!--<SMTP name="Mail" subject="****SaaS系統正式版異常信息" to="message@message.info" from="message@lengjing.info" smtpUsername="message@message.info" smtpPassword="LENG****1234" smtpHost="mail.lengjing.info" smtpDebug="false" smtpPort="25" bufferSize="10"> <PatternLayout pattern="[%-5p]:%d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n"/> </SMTP>--> <!-- ${sys:user.home} windows下指C:\Users\用戶名\logs路徑 --> <!-- 這個會打印出所有的debug及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔--> <RollingFile name="RollingFileDebug" fileName="${logFilePath}/log_debug.log" filePattern="${logFilePath}/debug/debug-%d{yyyy-MM-dd-HH-mm}-%i.log"> <!--ThresholdFilter :日志輸出過濾--> <!--level="info" :日志級別,onMatch="ACCEPT" :級別在info之上則接受,onMismatch="DENY" :級別在info之下則拒絕--> <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/> <!-- Policies :日志滾動策略--> <Policies> <!--關鍵點在於 filePattern后的日期格式,以及TimeBasedTriggeringPolicy的interval,日期格式精確到哪一位,interval也精確到哪一個單位--> <!-- TimeBasedTriggeringPolicy :時間滾動策略,每一天生成一個新的文件, modulate="true" : 產生文件是否以0點偏移時間--> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <!-- SizeBasedTriggeringPolicy :文件大小滾動策略--> <SizeBasedTriggeringPolicy size="100MB"/> </Policies> <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 --> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="RollingFileInfo" fileName="${logFilePath}/log_info_now.log" filePattern="${logFilePath}/info/info-%d{yyyy-MM-dd-HH-mm}-%i.log"> <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="RollingFileWarn" fileName="${logFilePath}/log_warn_now.log" filePattern="${logFilePath}/warn/warn-%d{yyyy-MM-dd-HH-mm}-%i.log"> <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n1"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> <RollingFile name="RollingFileError" fileName="${logFilePath}/log_error_now.log" filePattern="${logFilePath}/error/error-%d{yyyy-MM-dd-HH-mm}-%i.log"> <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{YYYY-MM-dd HH:mm:ss}] [%t] %-5p - %l - %m%n"/> <Policies> <TimeBasedTriggeringPolicy interval="1" modulate="true"/> <SizeBasedTriggeringPolicy size="100 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> </appenders> <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效--> <loggers> <!-- Root節點用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出 --> <root level="info"> <appender-ref ref="Console"/> <appender-ref ref="log"/> <appender-ref ref="RollingFileDebug"/> <appender-ref ref="RollingFileInfo"/> <appender-ref ref="RollingFileWarn"/> <appender-ref ref="RollingFileError"/> </root> <!--過濾掉spring和mybatis的一些無用的DEBUG信息--> <!--Logger節點用來單獨指定日志的形式,name為包路徑,比如要為org.springframework包下所有日志指定為INFO級別等。 --> <logger name="org.springframework" level="INFO"/> <logger name="org.mybatis" level="INFO"/> <!--log4j2 自帶過濾日志--> <Logger name="org.apache.catalina.startup.DigesterFactory" level="error"/> <Logger name="org.apache.catalina.util.LifecycleBase" level="error"/> <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/> <logger name="org.apache.sshd.common.util.SecurityUtils" level="warn"/> <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/> <Logger name="org.crsh.plugin" level="warn"/> <logger name="org.crsh.ssh" level="warn"/> <Logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="error"/> <Logger name="org.hibernate.validator.internal.util.Version" level="warn"/> <logger name="org.springframework.boot.actuate.autoconfigure.CrshAutoConfiguration" level="warn"/> <logger name="org.springframework.boot.actuate.endpoint.jmx" level="warn"/> <logger name="org.thymeleaf" level="warn"/> <!--AsyncLogger :異步日志,LOG4J有三種日志模式,全異步日志,混合模式,同步日志,性能從高到底,線程越多效率越高,也可以避免日志卡死線程情況發生--> <!--additivity="false" : additivity設置事件是否在root logger輸出,為了避免重復輸出,可以在Logger 標簽下設置additivity為”false”--> <!-- <AsyncLogger name="AsyncLogger" level="trace" includeLocation="true" additivity="false"> <appender-ref ref="RollingFileError"/> </AsyncLogger>--> </loggers> </configuration>
- 再在SpringBoot配置文件中引入該配置
logging: config: classpath:log4j2.xml