Spring mvc 集成logback日志功能

一、概述

        这一篇中,我们将紧接着上一篇Spring mvc入门-登录例子,把日志功能集成进来。Java日志有好几种实现方式,例如commons-logging+log4j、slf4j+log4j、slf4j+logback等待。这里不对每一种进行介绍,我们使用最流行的slf4j+logback的组合方式。大家可以参考这篇java日志知识,以便对日志有个大致的了解。对于logback的各种配置详解可以参考这官方文档:https://logback.qos.ch/manual/configuration.html

二、操作步骤

1、添加pom依赖

 <!--日志-->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.12</version>
    </dependency>
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.0.13</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.janino</groupId>
      <artifactId>janino</artifactId>
      <version>2.6.1</version>
    </dependency>
    <!--lombok-->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.12.4</version>
    </dependency>
  </dependencies>
最基础的两个jar是slf4j-api和logback-classic。其中slf4j-api是提供的日志接口,logback-classic提供的是接口实现。很多网上教程还添加了logback-core依赖,其实logback-classic已经包含了logback-core,如图所示:
如果在logback的配置文件里面要使用if 等表达式,那么还需要添加janino依赖。如果要使用@Slf4j的注解话,还需要添加lombok依赖。

2、编辑logback.xml配置文件

在resources目录下添加logback.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true"
			   xmlns="http://ch.qos.logback/xml/ns/logback"
			   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			   xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback
			   http://ch.qos.logback/xml/ns/logback/logback.xsd">

	<property scope="context" name="AppName" value="login-demo" />
	<property scope="context" name="ServerName" value="login-demo" />

	<!-- 如果定义了运行环境(比如tomcat启动时export到环境变量run_env),则启用下面的配置 -->
	<if condition='isDefined("run_env")'>
		<then>
			<appender name="rollingFile"
					  class="ch.qos.logback.core.rolling.RollingFileAppender">
				<file>../log/${ServerName}/${AppName}.log</file>
				<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
					<fileNamePattern>../log/${ServerName}/${AppName}.log.%d{yyyy-MM-dd}</fileNamePattern>
					<maxHistory>7</maxHistory>
				</rollingPolicy>
				<encoder>
					<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%.15thread] %logger{36}:%X{sysUser} - %.-4096msg%n</pattern>
				</encoder>
			</appender>

			<root level="INFO">
				<appender-ref ref="rollingFile" />
			</root>
		</then>
		<else>
			<!--控制台打印-->
			<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
				<encoder>
					<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%.15thread] %logger{36} - %.-4096msg%n</pattern>
				</encoder>
			</appender>

			<!--输出到文件-->
			<appender name="rollingFile"
					  class="ch.qos.logback.core.rolling.RollingFileAppender">
				<file>../log/${ServerName}/${AppName}.log</file>
				<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
					<fileNamePattern>../log/${ServerName}/${AppName}.log.%d{yyyy-MM-dd}</fileNamePattern>
					<maxHistory>7</maxHistory>
				</rollingPolicy>
				<encoder>
					<pattern>%d{HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
				</encoder>
			</appender>

			<!--根loger,没有Loger则默认用此loger,打info级别用户日志-->
			<root level="INFO">
				<appender-ref ref="console" />
				<appender-ref ref="rollingFile" />
			</root>
		</else>
	</if>
</configuration>
这是一个接近生产用的配置文件。根据不同的条件,将日志输出到不同的地方。如果tomcat启动时,定义了run_env环境变量,则将日志输出到滚动日志文件中,例如log/login-demo/login-demo.log。encoder定义了日志打印的格式,例如:
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%.15thread] %logger{36} - %.-4096msg%n
对应的一条日志信息:
2017-11-28 10:13:30.442 ERROR [bio-8080-exec-8] c.c.demo.controllers.LoginController - 用户名密码错误
大家可以参考着日志信息,去了解每个参数的意义。更详细的配置信息如Logger、appender、encoder、layout、filter请参考官方文档。

3、打印日志

package com.xxx.demo.controllers;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;

/**
 * Created by gameloft9 on 2017/11/27.
 */
@Slf4j
@Controller
public class LoginController {

    public static final String USER_NAME = "gameloft9";

    public static final String PWD = "123456";

    /**
     * 登录页面入口
     */
    @RequestMapping(value = "/index.do", method = RequestMethod.GET)
    public String index(Model model, HttpServletResponse response) {
        log.info("进入登录页面");
        return "login";
    }

    /**
     * 登录请求
     */
    @RequestMapping(value = "/login.do", method = RequestMethod.POST)
    public String login(Model model, String name, String pwd) {
        if (USER_NAME.equalsIgnoreCase(name) && PWD.equals(pwd)) {
            model.addAttribute("name", "name");
            return "home";
        }

        log.info("用户名密码错误,name:{},pwd:{}",name,pwd);
        model.addAttribute("errInfo", "用户名或密码错误!");
        return "login";
    }
}

在controller上面加上@Slf4j注解,然后就可以直接使用log打印日志了,例如log.info(),log.debug(),log.error()。

三、运行结果



下一篇将把数据库访问集成进来,敬请期待。

猜你喜欢

转载自blog.csdn.net/gameloft9/article/details/78651780