背景:项目除业务日志外,需要将请求入参以及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>