Java Logger 使用总结


Java Logger 使用总结

  • logger 背景知识
    • logback取代 log4j的理由: http://www.cnblogs.com/lixuwu/p/5804793.html
    • logback、log4j、log4j2三种日志框架性能检测——为什么用log4j2 : https://blog.csdn.net/qq_32250495/article/details/82382052
    • Log4j2的性能为什么这么好?:https://mp.weixin.qq.com/s/ZOkKxYAmRy950lsUcf9RuA
  • Spring Boot 日志
    • Spring Boot 默认使用Logback作为日志记录工具。日志默认输出到控制台但也能输出到文件中。我们通过spring-boot-starter-logging 加入Logback依赖,其实只要我们加入任意的Spring Boot starter 都会默认引入spring-boot-starter-logging,因此 我们不需要分开加入他们
    •  我们可以在application.properties或者application.yml中设置日志的级别、输出的文件名、输出路径、定义console, file 中logging的样式等。
logging.level.root= WARN
logging.level.org.springframework.security= DEBUG
logging.level.org.springframework.web= ERROR
logging.level.org.hibernate= DEBUG

logging.file = mylogfile.log 

logging.path = concretepage/logs  

logging.pattern.console= %d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n
logging.pattern.file= %d{yyyy-MMM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{15} - %msg%n
    • 如果想使用XML配置Logback,则需要在 resources 路径下创建 logback-spring.xml文件,如果Spring Boot使用了Log4j2 ,则需要创建 log4j2-spring.xml 。
    • Spring Boot 想使用Log4j2 ,则需要修改 Maven 依赖

   org.springframework.boot
   spring-boot-starter-web
   
   
      
         org.springframework.boot
         spring-boot-starter-logging
      
   



   org.springframework.boot
   spring-boot-starter-log4j2

使用 logstash-logback-encoder jar 包, 将 logback 日志传给 logstash


  net.logstash.logback
  logstash-logback-encoder
  4.11
    
    class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        logstash.rongziidc.com:5046
        
        class="net.logstash.logback.encoder.LogstashEncoder" >
            {"project":"com.rongziidc.creditorv2","type":"javaLog"}
            UTC+8
            yyyy-MM-dd HH:mm:ss.SSS
        
        
            
                5 minutes
            
        
    

logback中动态获取application中配置项 :

log4j 的使用

  • 添加 Maven依赖 , 最新上传 2012年5月


    log4j
    log4j
    1.2.17

配置log4j , log4j.xml 配置详解

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


    
    class="org.apache.log4j.ConsoleAppender">
        
        class="org.apache.log4j.PatternLayout">
            
        
        
        class="org.apache.log4j.varia.LevelRangeFilter">
            
            
            
            
        
    

    
    class="org.apache.log4j.FileAppender">
        
        
        
        
        
        
        
        
        
        
        class="org.apache.log4j.PatternLayout">
            
        
    

    
    class="org.apache.log4j.RollingFileAppender">
        
        
        
        
        
        
        
        
        `
        class="org.apache.log4j.PatternLayout">
            
            
        
    

    
    class="org.apache.log4j.DailyRollingFileAppender">
        
        
        
        
        
        
        
        class="org.apache.log4j.PatternLayout">
            
        
    

    
    
        
        
    

    
    
        
        
        
        
    

使用 log4j

import org.apache.log4j.Logger;
import org.junit.Test;

public class Test {
    private static Logger log = Logger.getLogger("logTest");
    @Test
    public void testLog(){
        log.debug("debug");
        log.error("error");
    }
}

log4j2 的使用

  • 添加 Maven 依赖


  org.apache.logging.log4j
  log4j-core
  2.13.0


  org.apache.logging.log4j
  log4j-api
  2.13.0

配置log4j2 ,log4j2.xml 配置详解

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





    
    
        
        
                 
            
        

        
        
            
        

        
        
                   
            
            
            
                 
                 
            
        

        
            
            
            
                 
                 
            
            
            
        

        
            
            
            
                 
                 
            
        
     

     
     
     
         
         
         
         
         
             
             
             
             
         
     

使用 log4j2

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

private static Logger logger_ = LogManager.getLogger(DateUtils2Joda.class);

logback

  • 添加 Maven依赖,logback-classic本身实现了SLF4J API

    
        ch.qos.logback
        logback-classic
        1.2.3
    

配置 logback , logback.xml详解

<?xml version="1.0" encoding="UTF-8"?>
  
  
  
  
  
  
  
  
  
    
  
   
  class="ch.qos.logback.core.ConsoleAppender"> 
    
    
            ${CONSOLE_LOG_PATTERN}
        
        utf8
    
  

    class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        class="ch.qos.logback.classic.filter.LevelFilter">
            ERROR
            DENY
            ACCEPT
        
        
            UTF-8
            [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{36}: %msg%n
        
        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            ${LOG_HOME}/info.%d{yyyy-MM-dd}.log
            30
        
    
 
    class="ch.qos.logback.core.rolling.RollingFileAppender">
        
        class="ch.qos.logback.classic.filter.ThresholdFilter">
            error
        
        
            UTF-8
            [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] %-5level %logger{36}: %msg%n
        
        class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            ${LOG_HOME}/error.%d{yyyy-MM-dd}.log
            
            30
        
    

  
  
  
  
  
  
    
    
    
  

使用 logback

private static Logger logging = LoggerFactory.getLogger(TestController.class);
 
@RequestMapping("/testLogger")
public void testLogger(int id, String name) {
    logging.info("id:{}, name:{}",id,name);
}

slf4j (Simple Logging Facade for Java)

slf4j 背景知识 官方文档 , github

slf4j 主要是为了给Java日志提供一个标准、规范的API,意义在于提供接口,具体实现交由其他日志框架
slf4j 使得应用程序可以在运行时选择绑定到一个特定的日志框架(如:java.util.logging、Log4j、 Logback),这通过在应用程序的类路径中添加对应的日志框架来实现。如果在类路径中配置的日志框架不可用,抽象层就会立刻取消调用日志的相应逻辑
阿里巴巴Java开发手册中提出:应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖SLF4J 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一
添加 Maven 依赖


    org.slf4j
    slf4j-api
    1.7.2


    org.slf4j
    slf4j-log4j12
    1.7.2

配置log4j ,xml配置,可以参见log4j 部分

### 设置###
log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=E://logs/error.log ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=E://logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

ava测试类 : 直接使用的是 org.slf4j.Logger ,而不是log4j

package test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class Log4jTestDemo {
    private static Logger logger = LoggerFactory.getLogger(Log4jTestDemo.class);

    public static void main(String[] args) {
        // 记录debug级别的信息
        logger.debug("This is debug message.");
        // 记录info级别的信息
        logger.info("This is info message.");
        // 记录error级别的信息
        logger.error("This is error message.");
    }
}