日志介绍
日志已经成为应用软件中不可缺少的一部分,现在我没发现哪个上线并且正常运营的项目没有添加日志;并且是否写日志已经成为了检测程序员是否专业的一个基本品德,就像写注释一样,灰常重要!Apache的开源项目Log4j是一个功能强大的日志组件,可以提供方便的日志记录。其他经常使用的还有slf4j、logback等日志组件。无论那种日志处理技术都能够满足当前的需求。
项目说明
现在参与的项目用的JBoss服务器,使用EJB实现的分布式,并且拆分成了多个模块,每个模块在部署的时候会将dao层,service层,web层统一打成一个ear包部署。我们要做的 是各个模块的日志文件独立输出到一个文件中,并且每层生成一个log文件。
第一步:排除Jboss log4j
因为jboss已经集成了log4j 的功能,我们可以直接使用JBoss的log4j,但是我们有自己的日志输出规则,而jBoss的规则最好不要修改,所以还是使用自己的log4j比较好。
我们需要修改自己模块的ear里的jboss-deployment-structure.xml文件。添加<exclusions>
标签的内容,意思是排除系统的jar包。
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<exclusions>
<module name="org.apache.log4j" />
<module name="org.apache.commons.logging" />
<module name="org.log4j" />
<module name="org.jboss.logging" />
</exclusions>
</deployment>
<sub-deployment name="itoo-exam-scoreanalyze-core.jar">
<exclusions>
<module name="org.apache.log4j" />
<module name="org.apache.commons.logging" />
<module name="org.log4j" />
<module name="org.jboss.logging" />
</exclusions>
<dependencies>
<module name="org.jboss.xnio" />
<module name="org.apache.shiro">
<imports>
<include path="META-INF**" />
<include path="org**" />
</imports>
</module>
<module name="org.jasig.cas.client">
<imports>
<include path="META-INF**" />
<include path="org**" />
</imports>
</module>
<module name="org.springframework.data">
<imports>
<include path="META-INF**" />
<include path="org**" />
</imports>
</module>
</dependencies>
</sub-deployment>
<sub-deployment name="itoo-exam-scoreanalyze-web.war">
<exclusions>
<module name="org.apache.log4j" />
<module name="org.apache.commons.logging" />
<module name="org.log4j" />
<module name="org.jboss.logging" />
</exclusions>
<dependencies>
<module name="org.jboss.xnio" />
<module name="org.apache.shiro">
<imports>
<include path="META-INF**" />
<include path="org**" />
</imports>
</module>
<module name="org.jasig.cas.client">
<imports>
<include path="META-INF**" />
<include path="org**" />
</imports>
</module>
<module name="org.springframework.data">
<imports>
<include path="META-INF**" />
<include path="org**" />
</imports>
</module>
</dependencies>
</sub-deployment>
</jboss-deployment-structure>
第二步:引入log4j 的jar包
下载log4j-1.2.9.jar文件放到 *:\jboss-eap-6.2\modules\org\springframework\spring\snowdrop 目录下,并且在module.xml中添加log4j-1.2.9.jar的配置。
第三步:添加log4j.xml配置文件
下面是以itoo-exam-scoreanalyze 模块做的实例,在log4j.xml配置文件配置日志生成规则:dao,service,controller每层拥有一个独立的log文件,并且每天生成一个以日期为名的log文件,定义好日志输出路径。
下面是配置文件示例:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
debug="false">
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
</layout>
</appender>
<appender name="DEFAULT-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<param name="File" value="D:/scoreanalyze-default.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Append" value="false" />
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%X{usreId}] %-5p %c{2} - %m%n" />
</layout>
</appender>
<appender name="ERROR-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-error.log" /> -->
<!-- 本地路径 -->
<param name="File" value="D:/scoreanalyze-error.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Append" value="false" />
<param name="Encoding" value="UTF-8" />
<param name="threshold" value="error" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
</layout>
</appender>
<appender name="SERVICE-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-service.log" /> -->
<!-- 本地路径 -->
<param name="File" value="D:/scoreanalyze-service.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Append" value="false" />
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
</layout>
</appender>
<appender name="DAO-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-dao.log" /> -->
<!-- 本地路径 -->
<param name="File" value="D:/scoreanalyze-dao.log" />
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Append" value="false" />
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
</layout>
</appender>
<appender name="CONTROLLER-APPENDER" class="org.apache.log4j.DailyRollingFileAppender">
<!-- <param name="File" value="/usr/itoo-exam-log/scoreanalyze-controller.log" /> -->
<!-- 本地路径 -->
<param name="File" value="D:/scoreanalyze-controller.log" />
<!-- 配置一天打一个日志文杰 -->
<param name="DatePattern" value="'.'yyyy-MM-dd" />
<param name="Append" value="false" />
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d [%X{userId}] %-5p %c{2} - %m%n" />
</layout>
</appender>
<!-- service日志,name写该层的全限定名 -->
<logger name="com.tgb.itoo.exam.scoreanalyze.service.impl" additivity="true">
<level value="debug" />
<appender-ref ref="SERVICE-APPENDER" />
</logger>
<!-- controller日志 -->
<logger name="com.tgb.itoo.exam.scoreanalyze.controller" additivity="true">
<level value="debug" />
<appender-ref ref="CONTROLLER-APPENDER" />
</logger>
<!-- dao日志 -->
<logger name="com.tgb.itoo.exam.scoreanalyze.eao.impl" additivity="true">
<level value="debug" />
<appender-ref ref="DAO-APPENDER" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="CONSOLE" />
<appender-ref ref="DEFAULT-APPENDER" />
<appender-ref ref="ERROR-APPENDER" />
</root>
</log4j:configuration>
第四步:Web.xml中配置log4j
**在最上面添加即可**
<!--log4j的配置文件 -->
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>/WEB-INF/classes/config/log4j.xml</param-value>
</context-param>
<!--启动一个watchdog线程每1800秒扫描一下log4j配置文件的变化 -->
<context-param>
<param-name>log4jRefreshInterval</param-name>
<param-value>1800000</param-value>
</context-param>
<!--spring log4j监听器 -->
<listener>
<listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
</listener>
然后就可以在代码中输出日志了
第五步:Controller层代码示例
定义logger 类:
Private Logger logger =
(Logger) Logger.getLogger(XXXXXControllerImpl.class.getName());
在方法的关键点打印日志信息:
/**
* 根据教师id查询该教师监考过的考场信息
*
* @param request
* @param response
*/
@RequestMapping("queryExamRoomInfo")
public void queryExamRoomInfo(HttpServletRequest request,
HttpServletResponse response)
{
//关键点1.方法名称,(类名会自动加载上)
StringBuilder str = new StringBuilder("queryExamRoomInfo-->");
//关键点2. 入口参数信息
// 获取数据库名称
String dataBaseName = "itoo_exam";
// String dataBaseName = (String) request.getSession().getAttribute(CloudContext.DatabaseName);
str.append("dataBaseName=").append(dataBaseName).append("_");
// 获取监考教师id
String teacherId = "16f29zfmuY1nd875JJ2jUa";
// String teacherId =(String)request.getSession().getAttribute();
str.append("teacherId=").append(teacherId).append("_");
JacksonJsonUntil jacksonJsonUtil = new JacksonJsonUntil();
List<Map<Serializable, Serializable>> listMaps = new ArrayList<Map<Serializable, Serializable>>();
try
{
// 根据监考教师id进行查询考场安排信息
listMaps = invigilateBean.queryExaminationRoomArrangementByTeacherId(teacherId,dataBaseName);
//关键点3. 返回信息的判断
if(null == listMaps || listMaps.size() == 0){
str.append("查询考场安排信息:selectFromDb_listSize=0_");
}else{
str.append("查询考场安排信息:selectFromDb_listSize=").append(listMaps.size()).append("_");
}
}
catch (Exception e)
{
//关键点4. 异常信息,觉得应该用warn或者erro级别打印出来
str.append("encounterError:").append(e.getMessage()).append("_");
//logger.error("encounterError:"+ e.getMessage());
//e.printStackTrace();
}finally{
//关键点5. 将整个日志信息输出
logger.info(str.toString());
}
// 转换成json
jacksonJsonUtil.beanToJson(response, listMaps);
}
日志效果:
小结
利用好工具会使我们事半功倍,但是前提一定要用好,否则将会带来意想不到的后果,log4j也是,项目上线后一定要将日志级别上调至info或warn,否则打印过多的信息会降低系统速度,并且还要注意定期清理日志文件,降低磁盘占用。