热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

springboot日志【转】【补】

 市面上的日志框架日志门面(日志的抽象层)日志实现JCL(JakartaCommonsLogging)(2014)SLF4j(SimpleLoggingFacadeforJava)

 

市面上的日志框架

日志门面 (日志的抽象层) 日志实现
JCL(Jakarta Commons Logging)(2014) SLF4j(Simple Logging Facade for Java) jboss-logging Log4j     JUL(java.util.logging)    Log4j2    Logback

补充说明:Logback, Log4j , Log4j2都出于同一作者之手, 但Logback更新。

在使用日志时, 都是选一个左边门面(抽象层)、再选一个右边的实现;该用方法时只用右边门面方法 , 

Spring框架选用JCL日志,需要引用commons-logging.jar ,  SpringBoot框架选用 SLF4j和logback;

每一个日志的实现框架都有自己的配置文件。就算使用slf4j门面,日志实现框架用的还是自己本身的配置文件;

 springboot 日志【转】【补】

总结:

1)、SpringBoot底层也是使用slf4j+logback的方式进行日志记录;

2)、SpringBoot也把其他的日志都替换成了slf4j;

3)、中间替换包(以jck-over-slf4j.jar为例),其实内部被换成了SLF4JLogFactory

@SuppressWarnings("rawtypes")
public abstract class LogFactory {
    static String UNSUPPORTED_OPERATION_IN_JCL_OVER_SLF4J = "http://www.slf4j.org/codes.html#unsupported_operation_in_jcl_over_slf4j";
    static LogFactory logFactory = new SLF4JLogFactory();

 

springboot 日志【转】【补】

4)、如果我们要引入其他框架?一定要把这个框架的默认日志依赖移除掉,比如Spring框架用的是commons-logging;

<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-coreartifactId>
    <exclusions>
        <exclusion>
            <groupId>commons-logginggroupId>
            <artifactId>commons-loggingartifactId>
        exclusion>
    exclusions>
dependency>

 

日志测试

logback测试用例

@RunWith(SpringRunner.class)
@SpringBootTest
public class LoggingTest {
    Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    ApplicationContext ac;//注入上下文

    @Test
    public void contextLoads() {
        //日志的级别;
        //由低到高   trace//可以调整输出的日志级别;日志就只会在这个级别以以后的高级别生效
        logger.trace("这是trace日志...");
        logger.debug("这是debug日志...");
        //SpringBoot默认给我们使用的是info级别的,没有指定级别的就用SpringBoot默认规定的级别;root级别(用了info级别)
        logger.info("这是info日志...");
        logger.warn("这是warn日志...");
        logger.error("这是error日志...");
    }
    public ApplicationContext getAc() {
        return ac;
    }
    public void setAc(ApplicationContext ac) {
        this.ac = ac;
    }
}

 

application.properties配置文件

# springboot日志的配置文件,本处由application.properties中的spring.profiles.active=logging来启用本文件
# 指定log文件,也可以写固定的绝对路径, 如果file和path都指定了,那么file优先级更高
#logging.file=springboot02.log
# 指定log路径,默认使用使用spring.log作为文件名, 如果以/开头,则在当前磁盘的根目录下创建路径,如果不以/开头,则在当前应用目录下创建日志路径
logging.path=/springbootlog01/logs

# 日志占位符说明
# %d表示日期时间
# %thread表示线程名
# %-5level:级别从左显示5个字符宽度,左对齐
# %logger{50} 表示logger包路径加类名字最长50个字符
# %msg:日志消息
# %n是换行符

#  在控制台输出的日志的格式
logging.pattern.cOnsole=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n
# 指定文件中日志输出的格式
logging.pattern.file=%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n

# 指定com下的所有日志输出级别为trace
logging.level.com=trace

 

 

logback默认配置位于该目录: spring-boot-1.5.14.RELEASE.jar!/org/springframework/boot/logging/logback/defaults.xml和base.xml

 

 

日志配置

给类路径下放上每个日志框架自己的配置文件即可;SpringBoot就不使用他默认配置的了

日志系统 自定义文件 说明  
Logback logback.xml 直接被日志框架识别,不经过springboot , 不支持SpringBoot的profile功能.  
Logback logback-spring.xml 日志框架就不直接加载日志的配置项,由SpringBoot解析日志配置,可以使用SpringBoot的高级Profile功能  
Log4j2 log4j2.xml    
Log4j2 log4j2-spring.xml    
JDK (Java Util Logging) logging.properties    

 

logback-spring.xml 使用SpringBoot的profile功能如下:

<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
        
        <layout class="ch.qos.logback.classic.PatternLayout">
            <springProfile name="dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%npattern>
            springProfile>
            <springProfile name="!dev">
                <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ==== [%thread] ==== %-5level %logger{50} - %msg%npattern>
            springProfile>
        layout>
    appender>

 

 日志切换

  slf4j+log4j的方式 (已亲测)  processon地图 log4j2 (未亲测)  
pom.xml内容 

 

 

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
            <exclusions>
                
                <exclusion>
                    <groupId>ch.qos.logbackgroupId>
                    <artifactId>logback-classicartifactId>
                exclusion>
                
                <exclusion>
                    <groupId>org.slf4jgroupId>
                    <artifactId>log4j-over-slf4jartifactId>
                exclusion>
            exclusions>
        dependency>

        
        <dependency>
            <groupId>org.slf4jgroupId>
            <artifactId>slf4j-log4j12artifactId>
        dependency>

 

 

 

 

 

<dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
            <exclusions>
                <exclusion>
                    <artifactId>spring-boot-starter-loggingartifactId>
                    <groupId>org.springframework.bootgroupId>
                exclusion>
            exclusions>
        dependency>

<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starter-log4j2artifactId>
dependency>

 

 

 
 说明  此处直接去掉了slf4j的实现 , 必须换成log4j的实现  此处引用的是spring-boot-starter-log4j2场景启动器,替换了spring-boot-starter-logging场景启动器的功能  
       

 

自己喜欢的简易风

日志配置

#  在控制台输出的日志的格式
logging.pattern.cOnsole=%d{yyyy-MM-dd HH:mm:ss}\t↓%n%msg%n

 

日志格式

2019-12-04 09:59:37    ↓
Root WebApplicationContext: initialization completed in 813 ms
2019-12-04 09:59:38    ↓
Initializing ExecutorService 'applicationTaskExecutor'
2019-12-04 09:59:38    ↓
Tomcat started on port(s): 8080 (http) with context path '/es'
2019-12-04 09:59:38    ↓

 

在日志上打印请求唯一log标识

 

重点语句

org.slf4j.MDC;
MDC.put(TRACE_ID, traceId);
MDC.remove(TRACE_ID);

使用拦截器实现

package com.interceptors.logtag.interceptor;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

/**
 * 

日志拦截器

* *
@author zetting * @date 2018/8/27 11:18 */ @Component public class LogInterceptor extends HandlerInterceptorAdapter { private Logger log = LoggerFactory.getLogger(this.getClass()); /** * 日志跟踪标识 */ private static final String TRACE_ID = "TRACE_ID"; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String traceId = UUID.randomUUID().toString(); if (StringUtils.isEmpty(MDC.get(TRACE_ID))) { MDC.put(TRACE_ID, traceId); } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { MDC.remove(TRACE_ID); } }

 

 

【Springboot之搜索日志妙招】在日志上打印请求唯一log标识==>https://www.jianshu.com/p/b74ade8bbb57


推荐阅读
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • Spring框架入门指南:专为新手打造的详细学习笔记
    Spring框架是Java Web开发中广泛应用的轻量级应用框架,以其卓越的功能和出色的性能赢得了广大开发者的青睐。本文为初学者提供了详尽的学习指南,涵盖基础概念、核心组件及实际应用案例,帮助新手快速掌握Spring框架的核心技术与实践技巧。 ... [详细]
  • 本文作为“实现简易版Spring系列”的第五篇,继前文深入探讨了Spring框架的核心技术之一——控制反转(IoC)之后,将重点转向另一个关键技术——面向切面编程(AOP)。对于使用Spring框架进行开发的开发者来说,AOP是一个不可或缺的概念。了解AOP的背景及其基本原理,对于掌握这一技术至关重要。本文将通过具体示例,详细解析AOP的实现机制,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Spring注解开发指南:@Resource与@Component详解 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • 《Spring in Action 第4版:全面解析与实战指南》
    《Spring in Action 第4版:全面解析与实战指南》不仅详细介绍了Spring框架的核心优势,如简洁易测试、低耦合特性,还深入探讨了其轻量级和最小侵入性的设计原则。书中强调了声明式编程的优势,并通过基于约定的方法简化开发流程。此外,Spring的模板机制有效减少了重复代码,而依赖注入功能则由容器自动管理,确保了应用的灵活性和可维护性。 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • Spring框架的核心组件与架构解析 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
  • Hadoop 2.6 主要由 HDFS 和 YARN 两大部分组成,其中 YARN 包含了运行在 ResourceManager 的 JVM 中的组件以及在 NodeManager 中运行的部分。本文深入探讨了 Hadoop 2.6 日志文件的解析方法,并详细介绍了 MapReduce 日志管理的最佳实践,旨在帮助用户更好地理解和优化日志处理流程,提高系统运维效率。 ... [详细]
  • 在基于.NET框架的分层架构实践中,为了实现各层之间的松散耦合,本文详细探讨了依赖注入(DI)和控制反转(IoC)容器的设计与实现。通过合理的依赖管理和对象创建,确保了各层之间的单向调用关系,从而提高了系统的可维护性和扩展性。此外,文章还介绍了几种常见的IoC容器实现方式及其应用场景,为开发者提供了实用的参考。 ... [详细]
  • 本文将介绍一种扩展的ASP.NET MVC三层架构框架,并通过使用StructureMap实现依赖注入,以降低代码间的耦合度。该方法不仅能够提高代码的可维护性和可测试性,还能增强系统的灵活性和扩展性。通过具体实践案例,详细阐述了如何在实际开发中有效应用这一技术。 ... [详细]
  • PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解
    PHP连接MySQL的三种方法及预处理语句防止SQL注入的技术详解 ... [详细]
  • 本课程详细解析了Spring AOP的核心概念及其增强机制,涵盖前置增强、后置增强和环绕增强等类型。通过具体示例,深入探讨了如何在实际开发中有效运用这些增强技术,以提升代码的模块化和可维护性。此外,还介绍了Spring AOP在异常处理和性能监控等场景中的应用,帮助开发者更好地理解和掌握这一强大工具。 ... [详细]
  • SQLmap自动化注入工具命令详解(第28-29天 实战演练)
    SQL注入工具如SQLMap等在网络安全测试中广泛应用。SQLMap是一款开源的自动化SQL注入工具,支持12种不同的数据库,具体支持的数据库类型可在其插件目录中查看。作为当前最强大的注入工具之一,SQLMap在实际应用中具有极高的效率和准确性。 ... [详细]
author-avatar
风中的百合香迷人
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有