自定義過濾器
java代碼,目的是在mdc中放值,然后在日志中打印
package com.controller; import com.pojo.JsonData; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.MDC; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping(path = "/api/log/") public class LoggerController { Logger logger= LoggerFactory.getLogger(getClass()); @RequestMapping(path = "test1") public Object logTest1(){ logger.trace("-----trace級別日志-----"); logger.debug("-----debug級別日志-----"); logger.info("-----info級別日志-----"); logger.warn("-----warn級別日志-----"); logger.error("-----error級別日志-----"); return JsonData.buildSuccess(); } @RequestMapping(path = "test2") public Object logTest2(){ MDC.put("name","yangche"); MDC.put("age","25"); MDC.put("like","wujing"); logger.trace("-----trace級別日志-----"); logger.debug("-----debug級別日志-----"); logger.info("-----info級別日志-----"); logger.warn("-----warn級別日志-----"); logger.error("-----error級別日志-----"); logger.info(""); MDC.clear(); return JsonData.buildSuccess(); } }
寫一個過濾器
package com.filter; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; import org.springframework.util.StringUtils; public class SimpleLogFilter extends Filter<ILoggingEvent> { @Override public FilterReply decide(ILoggingEvent event) { System.err.println(event.getMDCPropertyMap().get("name")); if(StringUtils.isEmpty(event.getMdc().get("name"))){ return FilterReply.DENY; }else { return FilterReply.NEUTRAL; } } }
以上過濾器要繼承Filter<ILoggingEvent>,在變量event中可以取到mdc的數據,msg,等等等等,可以用java對日志進行自定義的判斷,過濾不需要的過濾器,對日志內容進行替換等等,隨心所欲。
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <!--控制台日志--> <appender name="consoleApp" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern> %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n </pattern> </layout> </appender> <!--ERROR級別日志--> <appender name="fileErrorApp" class="ch.qos.logback.core.rolling.RollingFileAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern> %date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n </pattern> </encoder> <!-- 設置滾動策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 路徑 --> <fileNamePattern>log/app.err.%d.log</fileNamePattern> <!-- 控制保留的歸檔文件的最大數量,超出數量就刪除舊文件,假設設置每個月滾動, 且<maxHistory> 是1,則只保存最近1個月的文件,刪除之前的舊文件 --> <MaxHistory>1</MaxHistory> </rollingPolicy> </appender> <!--INFO級別日志--> <appender name="fileInfoApp" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <!– onMatch="ACCEPT" 表示匹配該級別及以上 onMatch="DENY" 表示不匹配該級別及以上 onMatch="NEUTRAL" 表示該級別及以上的,由下一個filter處理,如果當前是最后一個,則表示匹配該級別及以上 onMismatch="ACCEPT" 表示匹配該級別以下 onMismatch="NEUTRAL" 表示該級別及以下的,由下一個filter處理,如果當前是最后一個,則不匹配該級別以下的 onMismatch="DENY" 表示不匹配該級別以下的 –> <onMatch>ACCEPT</onMatch> <!–<onMismatch>DENY</onMismatch>–> </filter>--> <filter class="com.filter.SimpleLogFilter"/> <!--我寫的過濾器,過濾的是mdc中name的值為空的日志內容,所以所有name為空值的不會被打印--> <encoder> <pattern> %X{name} %X{age} %X{like}-----%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%thread]%logger{56}.%method:%L -%msg%n </pattern> </encoder> <!-- 滾動策略 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 路徑 --> <fileNamePattern>log/app.info.%d.log</fileNamePattern> </rollingPolicy> </appender> <!--root level最低級別--> <root level="INFO"> <appender-ref ref="consoleApp"/> <appender-ref ref="fileInfoApp"/> <appender-ref ref="fileErrorApp"/> </root> </configuration>