• springboot03-日志功能


    日志框架

    1. 日志框架分为日志门面和日志实现.
      1. 使用时要选择一个日志门面作为抽象层, 再选一日志实现来作为其实现.
      2. 下图列出了常用的日志框架.
    2.  SpringBoot底层是Spring框架, 而Spring框架默认使用JCL, 故SpringBoot在框架内容部分也使用JCL.
      1. 但是spring-boot-starter-logging采用了slf4j+logback的形式.
      2. 当然, springboot也能自动适配(jul, log4j2)等日志, 并简化配置.

    SLF4j

    在系统中使用slf4j

    1. 首先要知道, 以后开发时, 日志记录方法的调用, 不应该直接调用日志的实现类, 而是调用日志抽象层里的方法.
      1. 给系统里面导入slf4j的jar包和和logback的jar包
      2. slf4j的使用演示
        import org.slf4j.Logger;
        import org.slf4j.LoggerFactory;
        public class HelloWorld {
        
            public static void main(String[] args) {
                Logger logger = LoggerFactory.getLogger(HelloWorld.class);
                
                logger.info("hello world");
            }
        }
    2. 虽说使用了slf4j, 但配置文件还是做成日志实现框架自己本身的配置文件.
      1. 适配层可以帮助我们解决slf4j和日志框架不匹配的问题

     遗留问题

    1. 众所周知, Spring使用commons-logging, Hibernate使用Jboss-logging, ....
    2. 使用的日志框架, 太多太杂, 所以我们需要统一日志记录, 即使别的框架也要一起使用slf4j.
    3. 那么如何让系统中所有的日志都统一到slf4j上? 三步
      1. 将系统中其他日志框架排除出去.
      2. 用对应的中间包替换原有的日志框架.
      3. 导入slf4j的具体实现.

    SpringBoot的日志关系 

    1. SpringBoot使用它来做日志功能
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-logging</artifactId>
      </dependency>
    2. 其底层依赖关系
      1. 如图, SpringBoot底层使用slf4j+logback的方式进行日志记录.
      2. SpringBoot把其他日志也都转成了slf4j
      3. 看一下中间替换包, 实际上和原本的包名类名都没变.
      4. 但是这里是用SLF4J的方式创建的, 以LogFactory为例
        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();
        ......
    3. springBoot能自动适配所有日志, 如果我们要引入其他框架, 一定要把这个框架的默认日志依赖移除掉!
      1. 举例: Spring框架底层用commons-logging, 但SpringBoot一上来就排除了它
        <dependency>          
            <groupId>org.springframework</groupId>              
            <artifactId>spring‐core</artifactId>              
            <exclusions>              
                <exclusion>                  
                    <groupId>commons‐logging</groupId>                              
                    <artifactId>commons‐logging</artifactId>                      
                </exclusion>                  
            </exclusions>              
        </dependency>    

    日志的使用

    默认配置

    1. SpringBoot已经默认帮我们配置好了日志, 可以直接使用
      @RunWith(SpringRunner.class)
      @SpringBootTest
      public class SpringBootLoggingApplicationTests {
      
          //记录器
          Logger logger = LoggerFactory.getLogger(getClass());
      
          @Test
          public void contextLoads() {
      
              logger.trace("这是trace日志...");
              logger.debug("这是debug日志...");
              logger.info("这是info日志...");
              logger.warn("这是warn日志...");
              logger.error("这是error日志...");
      
          }
      }
    2. 代码讲解
      1. 日志级别, 从低到高: trace, debug, info, warn, error
      2. 可以调整输出日志的级别, 日志只会在这个级别及更高级别生效.
      3. 若没有指定级别, 那么就是用SpringBoot的默认级别: info.
    3. 在配置文件中修改日志的默认配置
      #修改日志级别
      logging.level.包名=trace/debug/...
      
      #注意, logging.file.path和logging.path只能二选一
      #不指定路径, 则logging.file.path在当前项目下生成日志文件
      #logging.file.path=springboot.log
      #也可以指定完整路径
      logging.file.path=D:/springboot.log
      
      #在控制台指定输出日志的格式
      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
    4. 日志输出格式
      • %d表日期
      • %thread表示线程名
      • %‐5level:级别从左显示5个字符宽度
      • %logger{50} 表示logger名字长50个字符, 否则按照句点分割.
      • %msg: 日志消息
      • %n: 换行符.

    指定配置

    1. 在resources下放上每个日志框架的配置文件, SpringBoot就不会用默认配置了, 而用我们写的配置.
    2. Logback的配置文件名一定要写成: logback.xml或logback-spring.xml.
    3. 如果用logback.xml为名: 它会直接被日志框架识别, 绕过了SpringBoot.
    4. 如果用logback-spring.xml为名, 则日志框架不能直接加载日志的配置项, 而由SpringBoot加载, 这样我们就能使用springProfile功能了.
    5. SpringProfile功能举例
      <layout class="ch.qos.logback.classic.PatternLayout">             
          <!-- 指定什么环境使用什么模式 -->
          <!-- dev模式 -->
          <springProfile name="dev">                 
              <pattern> %d{yyyy‐MM‐dd HH:mm:ss.SSS} ‐‐‐‐> [%thread] ‐‐‐> %‐5level  %logger{50} ‐ %msg%n </pattern>             
          </springProfile>             
          <!-- 非dev模式 -->
          <springProfile name="!dev">                 
              <pattern> %d{yyyy‐MM‐dd HH:mm:ss.SSS} ==== [%thread] ==== %‐5level  %logger{50} ‐ %msg%n </pattern>             
          </springProfile>         
      </layout>
    6. 注意: 如果使用logback.xml作为文件名, 但还要使用profile功能, 会报错
      • Java.lang.IllegalStateException: Logback configuration error detected:
      • no applicable action for [springProfile]
  • 相关阅读:
    VC各种链接错的解决办法【转】http://www.2cto.com/kf/201203/124100.html
    error LNK2019: 无法解析的外部符号 _XXX,该符号在函数 XXX 中被引用
    CVTRES : fatal error CVT1100: 资源重复。类型: BITMAP LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    C++控制台没有引用的头文件也会编译的原因
    关于VS2008编译错误"error LNK2005: 已经在 .obj 中定义" 【转】http://akheyun.blog.163.com/blog/static/138249276201062221452697/
    IIS下PHP的ISAPI和FastCGI比较
    VC++常规错误1>nafxcwd.lib(afxmem.obj) 【转】
    不能将参数 2 从“const char *”转换为“LPCWSTR”【转】http://blog.sina.com.cn/s/blog_4a94a0db0100ktxp.html
    深入探究VC —— 编译器cl.exe(1)【转】http://blog.csdn.net/wangningyu/article/details/4830920
    Asp.net MVC Routing Debugger的使用
  • 原文地址:https://www.cnblogs.com/binwenhome/p/12877115.html
Copyright © 2020-2023  润新知