需求:将用户对每个接口的访问都记录日志,并将其输出到csv文件中,因为csv文件可以直接导入到数据库中。错误日志和其他级别的日志输出到txt文件中。
步骤如下:
1.在xml中配置
<context-param>
<param-name>log4jConfigLocation</param-name>
<param-value>classpath:log4jConfig.xml</param-value>
</context-param>
2.log4jConfig.xml,为了方便阅读后面的代码,我将其分为三部分,从上到下拼接即可完整
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<!-- 设置监视器输出方式 -->
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d %-5p %c.%M:%L - %m%n" />
</layout>
</appender>
<appender name="debugChannel"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="E://logs/debug.log" /><!-- 设置File参数:日志输出文件名 -->
<param name="Append" value="true" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="MaxBackupIndex" value="10" />
<param name="MaxFileSize" value="10KB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n" /><!-- 设置输出文件项目和格式 -->
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="DEBUG" /><!--设置将DEBUG级别的日志通过该通道输出-->
<param name="LevelMax" value="DEBUG" />
</filter>
</appender>
如下代码重点说明一下,避免大家走弯路,
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss},%r,%l,%m%n" />
这行代码中的value一定要用英文逗号隔开,每一个逗号代表输出的一个单元格,你的表头数量应该与该出的逗号数量和%m(自己记录的信息)中的逗号相加再加一
<appender name="infoChannel"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="E://logs/info.csv" /><!-- 设置File参数:日志输出文件名 -->
<param name="Append" value="true" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="MaxBackupIndex" value="10" />
<param name="MaxFileSize" value="10KB"/>
<param name="DatePattern" value="'.'yyyy-MM-dd-HH-mm"/>
<layout class="com.cvsconfig.CSVLayout"><!-- 指定重定义的输出类 -->
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss},%r,%l,%m%n" /><!-- 设置输出文件项目和格式 -->
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="INFO" /><!--设置将INFO级别的日志通过该通道输出-->
<param name="LevelMax" value="INFO" />
</filter>
</appender>
<appender name="warnChannel"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="E://logs/warn.log" /><!-- 设置File参数:日志输出文件名 -->
<param name="Append" value="true" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="MaxBackupIndex" value="10" />
<param name="MaxFileSize" value="10KB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n" /><!-- 设置输出文件项目和格式 -->
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="WARN" /><!--设置将WARN级别的日志通过该通道输出-->
<param name="LevelMax" value="WARN" />
</filter>
</appender>
<appender name="errorChannel"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="E://logs/error.log" /><!-- 设置File参数:日志输出文件名 -->
<param name="Append" value="true" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="MaxBackupIndex" value="10" />
<param name="MaxFileSize" value="10KB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n" /><!-- 设置输出文件项目和格式 -->
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="ERROR" /><!--设置将ERROR级别的日志通过该通道输出-->
<param name="LevelMax" value="ERROR" />
</filter>
</appender>
<appender name="fatalChannel"
class="org.apache.log4j.RollingFileAppender">
<param name="File" value="E://logs/fatal.log" /><!-- 设置File参数:日志输出文件名 -->
<param name="Append" value="true" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 -->
<param name="MaxBackupIndex" value="10" />
<param name="MaxFileSize" value="10KB"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n" /><!-- 设置输出文件项目和格式 -->
</layout>
<filter class="org.apache.log4j.varia.LevelRangeFilter">
<param name="LevelMin" value="FATAL" /><!--设置将FATAL级别的日志通过该通道输出-->
<param name="LevelMax" value="FATAL" />
</filter>
</appender>
<logger name="com.hangar.admin">
<level value="WARN" />
</logger>
<!-- 下面配置一些第三方包的日志过滤级别,用于避免刷屏 -->
<logger name="org.springframework">
<level value="WARN" />
</logger>
<logger name="org.hibernate">
<level value="WARN" />
</logger>
<logger name="com.mchange">
<level value="WARN"/>
</logger>
<logger name="org.apache">
<level value="WARN"/>
</logger>
<logger name="com.opensymphony">
<level value="WARN"/>
</logger>
<logger name="com.hangar.common">
<level value="WARN"/>
</logger>
<logger name="freemarker.cache">
<level value="WARN"/>
</logger>
<root>
<!--日志输出最低级别-->
<!-- <priority value="STDOUT" /> -->
<!-- 设置接收所有输出的通道 -->
<appender-ref ref="STDOUT" />
<!-- 输出到TOMCAT日志目录中 -->
<appender-ref ref="infoChannel" />
<appender-ref ref="debugChannel" />
<appender-ref ref="warnChannel" />
<appender-ref ref="errorChannel" />
<appender-ref ref="fatalChannel" />
</root>
</log4j:configuration>
3.重写类中Layout中的getHeader方法;
package com.cvsconfig;
import org.apache.log4j.PatternLayout;
/**
* @author intern
*重写layout加入表头信息
*/
public class CSVLayout extends PatternLayout {
private static final String HEADER = "time,elapsedTime,from,userId,userName,operate";
@Override
public String getHeader() {
//换行
return HEADER + System.getProperty("line.separator");
}
}
4.最后就是记录日志了,这里需要注意了
在需要增加日志的类中引入如下代码
private static Logger logger=Logger.getRootLogger();
在需要增加日志的地方增加如下代码
logger.info(info.getId()+","+info.getName()+","+"查询成功");
重点说明:在表头中的部分,在这里是按照英文逗号隔开,如果记录的内容有英文逗号,切记替换成中文逗号,不然会多一个单元格。
导出效果如下:
到这里就结束啦