专题--分布式开发之logback输出模块日志到单独文件
首先聊聊业务开发中常见的一个问题,如何输出不同业务场景的日志到不同的文件中。
这个场景在开发过程中很常见,我们的日志文件中除了会输出业务日志,还会输出统计、监控、异常等不同类型的日志,如果都放在同一个文件中,对于可读性和问题的定位都不友好。因此将不同类型的日志分别输出,
这里以输出统计日志到单独文件这一场景进行讲解。
1.配置文件修改
首先要定义统计日志appender及对应的logger。
Logback将记录事件的任务委托给称为appender的组件。
Appenders必须实现ch.qos.logback.core.Appender 接口。
在logback.xml中添加如下配置
<!-- 统计appender -->
<appender name="STATISTICS_APPENDER" class="ch.qos.logback.core.rolling.RollingFileAppender">
<append>true</append>
<file>${logging.path}/statistics.log</file>
<!-- to generate a log file everyday with a longest lasting of 30 days -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- logfile name with daily rolling-->
<FileNamePattern>
${logging.path}/statistics.log.%d{yyyy-MM-dd-HH}
</FileNamePattern>
<!-- log perserve days-->
<MaxHistory>720</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--output format:%d is for date,%thread is for thread name,%-5level:loglevel with 5 character %msg:log message,%n line breaker-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %level %C.%M[%F:%L] - %msg%n</pattern>
<!-- encoding -->
<charset>UTF-8</charset>
</encoder>
</appender>
这里我们定义了一个名为“STATISTICS_APPENDER”的appender,我们还需要定义一个logger与它绑定。
<!--统计logger-->
<logger name="statistics" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
<appender-ref ref="STATISTICS_APPENDER" />
</logger>
有了logger配置之后我们便可以在业务中定义对应的Logger对象来进行有目的的日志输出操作。
2.日志打印
配置完成之后,这里只需要在业务类中定义Logger实体,通过LoggerFactory的getLogger(String name) 方法将该Logger实体与配置的logger绑定。
private final static Logger STATISTICS_LOGGER =
LoggerFactory.getLogger("statistics");
在需要进行业务日志输出的位置调用 Logger.info(String msg)方法进行日志打印。
AccountStatisticsLogEntity accountStatisticsLogEntity = new AccountStatisticsLogEntity().setUser_id(accountDobj.getUserId())
.setAb_balance_id(accountDobj.getAccBalanceId())
.setAb_trade_amount_real(String.valueOf(flowActualAddAmount))
.setAb_trade_type(String.valueOf(AccBalanceConst.ACC_BALANCE_TRADE_TYPE_IN))
.setAb_trade_source(String.valueOf(AccBalanceConst.ACC_BALANCE_TRADE_SOURCE_INTREFACE));
STATISTICS_LOGGER.info(accountStatisticsLogEntity.toString());
3.测试
配置完成后运行程序,查看日志输出目录生成了名为statistics.log的日志文件,日志内容为:
2018-10-08 15:06:23.464 [main] INFO
com.jiexun.transaction.common.log.Logger.info[Logger.java:93]
- {"app_name":"maccbasecore","app_version":"0.0.1",
- "host_name":"snowalker-newPC","ip":"172.30.83.86",
- "os":"windows 10",
- "transation_id":"77e8000a7c4e4230b5befe519ff1b12b",
- "log_index":23,
- "thread_id":"9ab58ce7e325485480dfc7a02f89ac04-93319555",
- "thread_name":"main","log_date":"2018-10-08 15:06:23.464",
- "log_level":"INFO",
- "file_name":"com.gaoyang.marketing.maccbasecore.biz.service.
- AccountBizServiceFacadeImpl","file_line":432,"content":
- {"id":"xxxxxxx",
- "amount":"xx","source":"xx",
- "type":"xx",
- "user_id":"xxxxxx"}}
到此,我们就完成了输出业务日志到指定的日志文件中这一需求。
这种针对不同场景的日志输出到不同日志文件的做法,在业务量较大的场景下,对于问题的定位和业务的统计及日志分析等场景都有着现实的指导意义。