slf4+log4j2简单配置

在网上看了好多的,还没有完全了解门面日志,简单的配置了一下,到是能用,以后再慢慢积累。闲话少说,直接上代码:

1.导包

    <!-- 
                引入slf4j的核心包
        url:::https://mvnrepository.com/artifact/org.slf4j/slf4j-api 
     -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>

    <!-- 
                引入slf4j对应log4j2的中间件
        url:::https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-slf4j-impl
     -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <scope>runtime</scope>
        <version>2.11.0</version>
    </dependency>

    <!-- 
                引入log4j2核心包
        URL::https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core
     -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <scope>runtime</scope>
        <version>2.11.0</version>
    </dependency>

2.配置文件,文件名log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>

<!-- status="OFF",可以去掉,它的含义为是否记录log4j2本身的event信息,默认是OFF -->
 <configuration status="OFF">
     <!-- 日志文件位置及名称 -->
     <Properties>
         <!-- 日志名称 -->
         <Property name="infoLog">info.log</Property>
         <Property name="errorLog">error.log</Property>
         
         
         <!-- 日志位置 -->
         <!-- 日志位置在tomcat根目录下 -->
         <!-- <Property name="tomcatClasspath" >${sys:catalina.home}/logInfo</Property> -->
         <!-- 日志位置在自定义磁盘位置 -->
         <Property name="tomcatClasspath" >C:/Users/Administrator/Desktop/logInfo</Property>
         <!-- 日志位置在eclipse根目录下 -->
         <!-- <Property name="tomcatClasspath" >logInfo</Property> -->
     </Properties>
     
     <!-- 输出终端配置 -->
     <appenders>
         <!-- 1.输出控制台的配置 target有两种输出方式:SYSTEM_OUT(默认)、SYSTEM_ERR    -->
         <Console name="Console" target="SYSTEM_ERR">
             <!-- 控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->
             <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
             <!-- 日志输出的格式:         时间           日志级别   类路径    行 方法 - 日志信息   -->                         
             <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
         </Console>
         
         <!-- 2.将日志保存到指定文件 -->
         <!-- append属性,每次运行tomcat时是否覆盖指定的日志文件(TRUE表示消息增加到指定文件中,false表示消息覆盖指定的文件内容,默认值是true) -->
         <File name="errorFile" fileName="${tomcatClasspath}/${infoLog}" append="true">
             <!--  添加过滤器,可以有选择的输出类别; 将level及其以上级别的日志(onMatch)保存到指定文件,其他级别的直接拒绝(onMismatch) -->
             <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
             <!-- 保存日志的格式:        年-月-日       at  时分秒  时区 日志级别 类的完全限定名 所在行 所在方法 - 具体日志信息-->
             <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
         </File>
         
         <!-- 这个会打印出所有信息,每次大小超过 size,则这size大小的日志会自动存入按年份-月份 建立的文件夹下面并进行压缩,作为存档 -->
         <!-- filePattern:压缩后的文件路径 -->
         <RollingFile name="RollingFile" fileName="${tomcatClasspath}/${errorLog}" filePattern="${tomcatClasspath}$${date:yyyy-MM}/app-%d{yyyyMMddHHmmssSSS}.log.gz" immediateFlush="true">
             <!-- 日志输出格式 -->
             <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS z} %-5level %class{36} %L %M - %msg%xEx%n"/>
             <!-- 日志文件大小(256KB  或  1MB) -->
             <SizeBasedTriggeringPolicy size="128KB"/>
             <!-- 最多保留文件数 -->
             <DefaultRolloverStrategy max="2"/>
         </RollingFile>
         
         
     </appenders>
     
    <!-- logger配置,只有定义了logger并引入的appender,appender才会生效 -->
    <loggers>
        <!--建立一个logger,此logger监听name对应的包名下的日志输出,level表示日志级别-->
        <!-- <Logger name="com.goatherd.erp.ssm.controller" level="trace" additivity="true">
            <AppenderRef ref="Console" />
        </Logger> -->
    
        <!--建立一个logger,此logger监听name对应的包名下的日志输出,level表示日志级别-->
        <!-- <Logger name="com.goatherd.erp.ssm.controller" level="info" additivity="true">
            <AppenderRef ref="errorFile" />
        </Logger> -->
    
        <!-- 将业务dao接口填写进去,并用控制台输出即可,这样只要调用到该包下的dao就会在控制台输出,适合测试用 -->
        <logger name="com.goatherd.erp.ssm.dao" level="TRACE" additivity="false">
            <appender-ref ref="Console" />
        </logger>
        
        <!-- 建立一个默认的root的logger。 -->
        <!-- 如果没有这个Root也会保存,所以不是很明白这个的作用。 -->
        <!-- 如果Root中引用的和Logger中引用的重复,则日志记录也会重复。 -->
        <!-- 属性level是日志的级别,level将和引用里的级别组合使用(level高于引用中的级别则按照此level,level低于引用中的级别则按引用中的级别)-->
        <Root level="trace">
            <!-- <AppenderRef ref="Console" /> -->
            <AppenderRef ref="errorFile" />
            <AppenderRef ref="RollingFile" />
        </Root>
    </loggers>
 </configuration>

3.Controller测试

    Logger logger = LoggerFactory.getLogger(LoginController.class);
    @Resource
    private TestDao testDao;
    @RequestMapping("/login.do")
    @ResponseBody
    public JsonResult login(String username,String password,String randomcode,HttpServletRequest request) {
        String[] err = null;
        try {
            String a = err[0];
        } catch (Exception e1) {
            logger.error(e1.getMessage(),e1);
            logger.info(e1.getMessage(),e1);
        }
        System.out.println("登录 。。。。。。");
        logger.trace("trace---1");
        logger.debug("debug---2");
        logger.info("info-----3");
        logger.warn("warn-----4");
        logger.error("error---5");
        testDao.selectUserInfo();
        Subject subject = SecurityUtils.getSubject();
        AuthenticationToken token = new UsernamePasswordToken(username, password);
        String msg = null;
        int state = 0;
        try {
            subject.login(token);//执行认证操作. 调用realm
        }catch(UnknownAccountException u){
            msg = "账号错误";state = 1;
        }catch(IncorrectCredentialsException i){
            msg = "密码错误";state = 1;
        }catch (AuthenticationException e) {
            msg = "认证失败";state = 1;
        }  
        return new JsonResult(state,null,msg);
    }

4.junit测试类

public class TestDAO {
    private TestDao testDao;
    
    private ApplicationContext config;
    @Before
    public void init(){
        String[] conf = {"config/spring-mvc.xml", "config/spring-mybatis.xml"};
        config = new ClassPathXmlApplicationContext(conf);  
    }  
    @Test
    public void test01() {
        testDao = config.getBean("testDao",TestDao.class);
        System.out.println(testDao.selectUserInfo());
//这里测试的话就会将SQL打印出来了 } }

 5.文件位置

   5.1如果文件放在resource的根目录下,则不需要配置

   5.2如果文件放在resource的其他目录下,在web.xml中配置

  <!-- log4j2配置文件的位置i -->
  <context-param>  
    <param-name>log4jConfiguration</param-name>  
    <param-value>classpath:config/log4j2.xml</param-value>  
  </context-param> 
  
 <listener>
    <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class>
 </listener>

  但是需要增加一个jar包:

    <!-- 
        用于解决web环境下关闭服务器时可能出现的log4j线程无法及时关闭的warn,web工程需要包含log4j-web,非web工程不需要
        https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-web
     -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-web</artifactId>
        <scope>runtime</scope>
        <version>2.11.0</version>
    </dependency>
原文地址:https://www.cnblogs.com/goatherd/p/11543697.html