springboot学习(八): 日志输出log4j2的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_36553913/article/details/83720528

说明

在学习springboot时,学习了log4j2日志文件的使用,使用AOP统一处理web请求日志,将日志记录到MongoDB中等内容,通过本篇博文,记录总结下springboot中日志的输出以及log4j2的配置、

正文

引入依赖

去除web自带的日志,引入log4j2的依赖,aop和mongo依赖

<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<exclusions>
				<exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-log4j2</artifactId>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-aop</artifactId>
		</dependency>

		<!--mongodb-driver -->
		<dependency>
			<groupId>org.mongodb</groupId>
			<artifactId>mongodb-driver</artifactId>
		</dependency>

		<!-- log4j-nosql -->
		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-nosql</artifactId>
			<version>2.9.1</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>compile</scope>
		</dependency>
	</dependencies>

配置文件log4j2.xml

在引入log4j2后,需要下resources目录下创建配置文件log4j2.xml文件,通过官方文档,可以对配置文件的结构有一个大概的了解,更详细的内容见:官方文档

<?xml version="1.0" encoding="UTF-8"?>;
<Configuration>
  <Properties>
    <Property name="name1">value</property>
    <Property name="name2" value="value2"/>
  </Properties>
  <Filter type="type" ... />
  <Appenders>
    <Appender type="type" name="name">
      <Filter type="type" ... />
    </Appender>
    ...
  </Appenders>
  <Loggers>
    <Logger name="name1">
      <Filter type="type" ... />
    </Logger>
    ...
    <Root level="level">
      <AppenderRef ref="name"/>
    </Root>
  </Loggers>
</Configuration>

这里通过配置文件,将日志信息分类保存到不同的文件,并且将日志信息输出到MongoDB中

<?xml version="1.0" encoding="UTF-8"?>
<!--启动项设置为 trace,加载 springboot 启动内部各种详细输出-->
<Configuration status="WARN">

    <Properties>
        <Property name="file_path">F:\StudyProject\springboot_study\log4j2\logs</Property>
    </Properties>
    <Appenders>
        <!--添加一个控制台追加器-->
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout>
                <!--<pattern>%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</pattern>-->
                <pattern>[%d] - [%c] - [%highlight{%level}] - [%method] - [%t] - %msg%n</pattern>
            </PatternLayout>
        </Console>
        <!--添加一个文本追加器-->
        <File name="File" fileName="C:\Users\wds\Desktop\springboot_study\log4j2\log.log">
            <PatternLayout>
                <pattern>[%-5p] %d %c - %m%n</pattern>
            </PatternLayout>
        </File>

        <RollingFile name="RollingFileInfo" fileName="${file_path}/info/info.log"
            filePattern="${file_path}/$${date:yyyy-MM}/info/info-%d{yyyy-MM-dd}-%i.log.gz">
            <!--<Filters>-->
                <ThresholdFilter level="INFO" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>
                <!--<ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>-->
            <!--</Filters>-->
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <!--归档每天的文件-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--限制单个文件的大小-->
                <SizeBasedTriggeringPolicy size="2MB"></SizeBasedTriggeringPolicy>
            </Policies>
            <!-- 限制每天的文件个数 -->
            <DefaultRolloverStrategy compressionLevel="0" max="10"></DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileWarn" fileName="${file_path}/warn/warn.log"
                     filePattern="${file_path}/$${date:yyyy-MM}/warn/warn-%d{yyyy-MM-dd}-%i.log.gz">
            <!--<Filters>-->
                <!--<ThresholdFilter level="WARN"></ThresholdFilter>-->
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>
            <!--</Filters>-->
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <!--归档每天的文件-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--限制单个文件的大小-->
                <SizeBasedTriggeringPolicy size="2MB"></SizeBasedTriggeringPolicy>
            </Policies>
            <DefaultRolloverStrategy compressionLevel="0" max="10"></DefaultRolloverStrategy>
        </RollingFile>

        <RollingFile name="RollingFileError" fileName="${file_path}/error/error.log"
                     filePattern="${file_path}/$${date:yyyy-MM}/error/error-%d{yyyy-MM-dd}-%i.log.gz">
            <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"></ThresholdFilter>
            <PatternLayout pattern="[%d][%t][%p][%c:%L] %m%n" />
            <Policies>
                <!--归档每天的文件-->
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
                <!--限制单个文件的大小-->
                <SizeBasedTriggeringPolicy size="2MB"></SizeBasedTriggeringPolicy>
            </Policies>
            <DefaultRolloverStrategy compressionLevel="0" max="10"></DefaultRolloverStrategy>
        </RollingFile>

        <NoSql name="databaseAppender">
            <MongoDB databaseName="test" collectionName="newlog" server="127.0.0.1" port="27017"></MongoDB>
        </NoSql>
    </Appenders>
    <Loggers>
        <Logger name="com.example.log4j2" level="DEBUG" additivity="true">
            <AppenderRef ref="File"></AppenderRef>
        </Logger>
        <Logger name="mongolog" level="trace" additivity="true">
            <AppenderRef ref="databaseAppender"/>
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFileInfo" />
            <AppenderRef ref="RollingFileWarn" />
            <AppenderRef ref="RollingFileError" />
            <AppenderRef ref="databaseAppender"/>
        </Root>
    </Loggers>
</Configuration>

AOP处理web请求日志

通过对controller设置切面来记录日志信息

@Aspect
@Component
public class WebLogAspect {

    private Logger logger = LogManager.getLogger(this.getClass());

    ThreadLocal<Long> startTime = new ThreadLocal<>();

    @Pointcut("execution(public * com.example.log4j2.controller..*.*(..))")
    public void webLog(){

    }

    @Before("webLog()")
    public void doBefore(JoinPoint joinPoint) throws Throwable{
        //接受到请求,记录请求内容
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = (HttpServletRequest) attributes.getRequest();

        logger.info("URL : " + request.getRequestURL().toString());
        logger.info("HTTP_METHOD : " + request.getMethod());
        logger.info("IP : " + request.getRemoteAddr());
        logger.info("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
        logger.info("ARGS : " + Arrays.toString(joinPoint.getArgs()));

        startTime.set(System.currentTimeMillis());
    }

    @AfterReturning(returning = "ret", pointcut = "webLog()")
    public void doAfterReturning(Object ret) throws Throwable{
        logger.info("RESPONSE : " + ret);
        logger.info("SPEND TIME : " + (System.currentTimeMillis() - startTime.get()));
    }

    @Around("webLog()")
    public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        logger.info(System.currentTimeMillis());
        Object object = proceedingJoinPoint.proceed();
        System.out.println(object);
        logger.info(System.currentTimeMillis());
        return object;
    }

}

源码地址:https://github.com/Edenwds/springboot_study/tree/master/log4j2
参考资料:
http://blog.didispace.com/springbootaoplog/
https://logging.apache.org/log4j/2.x/manual/configuration.html#Loggers

猜你喜欢

转载自blog.csdn.net/sinat_36553913/article/details/83720528
今日推荐