背景:項目除業務日誌外,需要將請求入參以及http請求的入參出參輸出到不同的日誌文件中
前提:
因是spring項目。比較古老 使用properties以及xml共同的方式
1:配置maven依賴:
<!-- Log libs -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
2:配置properties
cybershop.web.log.dir=${web.log.dir}
cybershop.web.log.info.filename=web-info
cybershop.web.log.debug.filename=web-debug
cybershop.web.log.external.request.filename=web-external
cybershop.web.log.internal.request.filename=web-internal
cybershop.web.log.warn.filename=web-warn
cybershop.web.log.error.filename=web-error
cybershop.web.log.maxhistory=${cybershop.log.maxhistory}
cybershop.web.log.maxfilesize=${cybershop.log.maxfilesize}
cybershop.web.log.charset=${cybershop.log.charset}
其中${}數據從主pom中獲取。示例:
<!-- log4j -->
<log4j.rootLogger>ERROR,consoleAppender</log4j.rootLogger>
<cybershop.logback.level>DEBUG</cybershop.logback.level>
3:配置xml文件
一:配置appender屬性用於輸出到文件
<appender name="EXTERNAL_REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${cybershop.web.log.dir}/${cybershop.web.log.external.request.filename}.json</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch>
</filter>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${cybershop.web.log.dir}/${cybershop.web.log.external.request.filename}.%d{yyyy-MM-dd}-%i.json</fileNamePattern>
<MaxHistory>${cybershop.web.log.maxhistory}</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${cybershop.web.log.maxfilesize}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 將日誌輸出成 JSON格式,幷包含預定義 logType: restapi_external_request -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeCallerData>false</includeCallerData>
<customFields>{"logType":"web_external_request"}</customFields>
</encoder>
</appender>
其中appender的name自定義即可。其他的應該不用多敘述
二:配置logger屬性
<logger name="external_request" additivity="false" >
<level value="info" />
<appender-ref ref="EXTERNAL_REQUEST" />
</logger>
appender-ref對應的名稱是appender定義的名稱。logger自定義的名稱 用於在類中調用
三:在類中定義
private static final Logger logger = LoggerFactory.getLogger("external_request");
使用logger.info或者其他輸出即可輸出文件到指定位置
完整xml代碼配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<property resource="logback.properties"/>
<appender name="file-info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${cybershop.web.log.dir}/${cybershop.web.log.info.filename}.json</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch>
</filter>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${cybershop.web.log.dir}/${cybershop.web.log.info.filename}.%d{yyyy-MM-dd}-%i.json</fileNamePattern>
<MaxHistory>${cybershop.web.log.maxhistory}</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${cybershop.web.log.maxfilesize}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 將日誌輸出成 JSON格式,幷包含預定義 logType: springlog -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeCallerData>false</includeCallerData>
<customFields>{"logType":"web_service"}</customFields>
</encoder>
</appender>
<appender name="EXTERNAL_REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${cybershop.web.log.dir}/${cybershop.web.log.external.request.filename}.json</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch>
</filter>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${cybershop.web.log.dir}/${cybershop.web.log.external.request.filename}.%d{yyyy-MM-dd}-%i.json</fileNamePattern>
<MaxHistory>${cybershop.web.log.maxhistory}</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${cybershop.web.log.maxfilesize}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 將日誌輸出成 JSON格式,幷包含預定義 logType: restapi_external_request -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeCallerData>false</includeCallerData>
<customFields>{"logType":"web_external_request"}</customFields>
</encoder>
</appender>
<appender name="INTERNAL_REQUEST" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${cybershop.web.log.dir}/${cybershop.web.log.internal.request.filename}.json</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY </onMismatch>
</filter>
<append>true</append>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${cybershop.web.log.dir}/${cybershop.web.log.internal.request.filename}.%d{yyyy-MM-dd}-%i.json</fileNamePattern>
<MaxHistory>${cybershop.web.log.maxhistory}</MaxHistory>
<TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<MaxFileSize>${cybershop.web.log.maxfilesize}</MaxFileSize>
</TimeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 將日誌輸出成 JSON格式,幷包含預定義 logType: restapi_internal_request -->
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<includeCallerData>false</includeCallerData>
<customFields>{"logType":"web_internal_request"}</customFields>
</encoder>
</appender>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>ACCEPT</onMismatch>
</filter>
<encoder charset="${cybershop.web.log.charset}">
<pattern>%d{yyyy-MM-dd HH:mm:ss} %-5p %logger{60} %m%n</pattern>
</encoder>
</appender>
<logger name="org.springframework" additivity="true" >
<level value="info" />
</logger>
<logger name="org.axonframework.unitofwork" additivity="true" >
<level value="info" />
</logger>
<logger name="org.quartz" additivity="true">
<level value="info" />
</logger>
<logger name="com.google" additivity="true">
<level value="info" />
</logger>
<logger name="com.novemberain" additivity="true">
<level value="info" />
</logger>
<logger name="net.rubyeye.xmemcached" additivity="true">
<level value="info" />
</logger>
<logger name="net.sf.ehcache" additivity="true">
<level value="info" />
</logger>
<logger name="com.comall.cybershop" additivity="true">
<level value="info" />
</logger>
<logger name="com.comall.cybershop.session" additivity="true">
<level value="info" />
</logger>
<logger name="external_request" additivity="false" >
<level value="info" />
<appender-ref ref="EXTERNAL_REQUEST" />
</logger>
<logger name="internal_request" additivity="false" >
<level value="info" />
<appender-ref ref="INTERNAL_REQUEST" />
</logger>
<root level="info">
<appender-ref ref="STASH"/>
<appender-ref ref="file-info"/>
<appender-ref ref="console"/>
</root>
</configuration>