log4j输出到csv文件中

需求:将用户对每个接口的访问都记录日志,并将其输出到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()+","+"查询成功");

重点说明:在表头中的部分,在这里是按照英文逗号隔开,如果记录的内容有英文逗号,切记替换成中文逗号,不然会多一个单元格。

导出效果如下:

到这里就结束啦

猜你喜欢

转载自blog.csdn.net/z19799100/article/details/108163865