log4j.xml里实现读取变量(spring容器篇)
- 需求背景
公司日志系统不太完善,集群的服务器日志散落在不同的服务器上,要从公司层面解决这个问题不太现实,目前的项目进度也不允许,当前系统会有很多对接,有上游下游,生产环境调试看日志太麻烦了, 所以准备自己动手做一个workaround。
另一方面,公司开发、上线有好几套环境,不可能每套环境都去改一次,用变量可以把对应信息写在zookeeper里,这样就可以一劳永逸了。
2. 前期调研
之前用过mongodb,而且capped collection用来做非永久性日志非常合适,于是就从这方面入手。四处找了找下来分析下来觉得还是用log4j来把日志输入,一方面这个 org.log4mongo 包装了写mongodb的所有方面用起来方便,另一方面,一个logger.info就可以做到这样的效果对代码的入侵是很小的。
3. 说干咱就干
首先pom里引入所需要的jar包,这里注意log4mongo只适用log4j 版本1.2.15 及以上。
<!-- for MongoDbAppender start --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>2.12.4</version> </dependency> <dependency> <groupId>org.log4mongo</groupId> <artifactId>log4mongo-java</artifactId> <version>0.7.4</version> </dependency> <!-- for MongoDbAppender end --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.15</version> </dependency>
log4j.xml里加入以下:
<appender name="mongoDBAppender" class="org.log4mongo.MongoDbAppender"> <param name="hostname" value="${hostName}" /> <param name="port" value="${port}" /> <param name="databaseName" value="${databaseName}" /> <param name="collectionName" value="${collectionName}" /> </appender> <appender name="asynAppender" class="org.apache.log4j.AsyncAppender"> <param name="bufferSize" value="100000" /> <appender-ref ref="mongoDBAppender" /> </appender> <logger name="com.xxx.xxx" additivity="false"> <level value="INFO" /> <appender-ref ref="CONSOLE" /> <appender-ref ref="asynAppender" /> </logger>
注意上面的log4j.xml里我用到了类似这样的 ${hostName} 变量读取。<