栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

Java日志使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java日志使用

Java日志使用
        • jul
        • log4j
        • jcl
        • slf4j
          • 1.slf4j+logback输出
          • 2.slf4j适配到log4j输出

jul

1.jul 简单测试:
jdk自带,不需要额外jar包

1.编写工具类
import java.util.logging.*
public class JulUtil {
    public void test1(){
        Logger logger = Logger.getLogger(JulService.class.getName());
        logger.log(Level.FINEST,"极好的");
        logger.log(Level.FINER,"挺好的的");
        logger.log(Level.FINE,"好的");
        logger.log(Level.CONFIG,"配置");
        logger.log(Level.INFO,"普通信息");
        logger.log(Level.WARNING,"警告");
        logger.log(Level.SEVERE,"严重的");
        logger.warning("警告的简单写法");
    }
}
2.测试
@Test
    public void test1(){
        JulService service = new JulService();
        service.test1();
        System.out.println("111");
        System.err.println("111");
    }

结果输出

控制台输出结果
八月 03, 2022 2:50:16 下午 com.log.jul.JulService test1 //洋红色
111 //黑色
严重: 严重的 //洋红色
111 //洋红色

可知:
控制台是洋红色 System.err.parintln
默认打印出info后面的日志:默认配置的日志级别是Info
级别的概念:ALL 

2.jul-父子关系

 public void test2(){
     //所有logger默认的父级是java.util.logging.LogManager$RootLogger
     //logger父子通过名字来决定
     Logger logger1 = Logger.getLogger("a");
     Logger logger2 = Logger.getLogger("a.b");
     Logger logger3 = Logger.getLogger("a.b.c");
     System.out.println(logger3.getParent().getName());//a.b
     System.out.println(logger3.getParent()== logger2);//true
     System.out.println(logger2.getParent()== logger1);//true
     System.out.println(logger1.getParent());//java.util.logging.LogManager$RootLogger
   }

3.日志重复打印

设置logger3自己的handler,会有日志重复输出的问题
ConsoleHandler handler = new ConsoleHandler();
logger3.addHandler(handler);
logger3.info("logger3.info");
控制台打印两遍日志
解决:不使用父级的handlers
logger3.setUseParentHandlers(false);

4.jul配置文件logging.properties

#默认继承父类
handlers= java.util.logging.ConsoleHandler
#默认全局logger级别
.level= INFO
#FileHandler格式
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter
#ConsoleHandler格式
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
#可以设置自己包内logger级别
com.log.jul.level = SEVERE

5.加载jul配置文件

public class JulService {
    //加载配置文件
    static LogManager logManager = LogManager.getLogManager();
    static{
        try {
            logManager.readConfiguration(JulService.class.getClassLoader().getResourceAsStream("logging.properties"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

6.代码内设置logger级别

  public void test1(){
    //继承配置的类,配置文件生效
    // Logger logger = Logger.getLogger("com.log.jul.level.abc");
       Logger logger = Logger.getLogger(JulService.class.getName());
    //设置logger级别
      logger.setLevel(Level.ALL);
    //获取到父级并设置所有handler(appender)级别
      Handler[] handlers = logger.getParent().getHandlers();
        for (Handler handler : handlers) {
            //设置handler级别
            handler.setLevel(Level.ALL);
        }
log4j

1.导入依赖


   log4j
   log4j
   1.2.17

2.log4j.properties配置控制台输出和输出到文件

#rootLogger日志级别,stdout,a1,a2把logger和其他的具体的appender关联
log4j.rootLogger=INFO,stdout
#设置控制台的appender:stdout是appender的名字,随便起
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#设置编码
log4j.appender.stdout.Encoding=UTF-8
#Target,控制台
log4j.appender.stdout.Target=System.out
#控制台级别
log4j.appender.stdout.Threshold= INFO
#输出格式,布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n

#输出到文件,配置文件appender,每天一个文件,缺点:不会自动清除日志文件
#若是只保留7天的日志:linux内 crontad
# find /home/simplecode/logs -type f -mtime +7 -exec rm -f {} ;
log4j.appender.a1=org.apache.log4j.DailyRollingFileAppender
#输出位置 获取项目目录--目录不需要提前创建,
log4j.appender.a1.File=${user.home}/simpleCode/log4j/a1.log
log4j.appender.a1.Threshold= INFO
log4j.appender.a1.layout=org.apache.log4j.PatternLayout
#输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行
log4j.appender.a1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n

#输出到文件,配置文件appender,可以指定单个文件最大的size,以及保留多少个日志文件
log4j.appender.a2=org.apache.log4j.RollingFileAppender
#输出位置 获取项目目录--目录不需要提前创建,
log4j.appender.a2.File=${user.home}/simpleCode/log4j/a2.log
#最大文件大小,保留个数(虽然不能控制日志覆盖的时间,但是确保了日志文件及时被清除)
log4j.appender.a2.File.size=100MB
log4j.appender.a2.MaxBackupIndex=7
log4j.appender.a2.Threshold= INFO
log4j.appender.a2.layout=org.apache.log4j.PatternLayout
#输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行
log4j.appender.a2.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n
#自己业务,因为继承了rootLogger就会在stdout输出,然后a1自己配置也会输出,a2不会输出
log4j.logger.com.suisui.log4j =ERROR,a1

3.编写工具类

public class Log4jService {
    //所有的日志技术,都有父子关系概念,通过"."确定父子关系
    //com.suisui.log4j.Log4jService,获取logger
    private static Logger logger = Logger.getLogger(Log4jService.class.getName());
    
    public void testAPI(){
        //输出日志
        logger.trace("trace");
        logger.debug("debug");
        logger.info("info");
        logger.warn("warn");
        logger.fatal("fatal");
    }
}

4.测试

public class Log4jTest {
    @Test
    public void test1(){
        Log4jService service = new Log4jService();
        service.testAPI();
    }
}
打印结果:
2022-08-03 15:39:56 FATAL com.suisui.log4j.Log4jService 19:fatal 
jcl

1.默认使用jul进行日志输出
1.1引入依赖


      commons-logging
      commons-logging
      1.2

1.2编写工具类

public class JclService {
    private Log log = LogFactory.getLog(JclService.class);
    public void testAPI(){
        //输出日志
        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warn");
        log.fatal("fatal");
    }
}

1.3测试

 @Test
    public void test1(){
        JclService service = new JclService();
        service.testAPI();
    }

1.4结果输出

八月 03, 2022 3:51:00 下午 com.suisui.jcl.JclService testAPI
信息: info
八月 03, 2022 3:51:00 下午 com.suisui.jcl.JclService testAPI
警告: warn
八月 03, 2022 3:51:00 下午 com.suisui.jcl.JclService testAPI
严重: fatal

2.log4j依赖+log4j.properties配置文件,使用log4j进行日志输出
2.1加入依赖

  
            log4j
            log4j
            1.2.17
 

2.2log4j.properties

#rootLogger日志级别,stdout,a1,a2把logger和其他的具体的appender关联
log4j.rootLogger=INFO,stdout
#设置控制台的appender:stdout是appender的名字,随便起
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#设置编码
log4j.appender.stdout.Encoding=UTF-8
#Target,控制台
log4j.appender.stdout.Target=System.out
#控制台级别
log4j.appender.stdout.Threshold= INFO
#输出格式,布局
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#输出:$d{日期}?p日志级别 c全类名 l第几行 m自己打印的message n换行
log4j.appender.stdout.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %-5p %20c %L:%m %n

2.3工具类测试类同上
2.4结果输出

2022-08-03 15:53:34 INFO  com.suisui.jcl.JclService 17:info 
2022-08-03 15:53:34 WARN  com.suisui.jcl.JclService 18:warn 
2022-08-03 15:53:34 FATAL com.suisui.jcl.JclService 19:fatal 
slf4j 1.slf4j+logback输出

1.1依赖

 
      org.slf4j
      jcl-over-slf4j
      1.7.25
 
 
      ch.qos.logback
      logback-classic
      1.2.3

(单独引入这个也可)
      ch.qos.logback
      logback-classic
      1.2.3
 

1.2 logback.xml




    logback
    
    

    
        
        
            INFO
        
        
            %d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
            
        
    

    
        ${log.path}
        
            
            ${log.path}.%d{yyyy-MM-dd}.log
            1
            100MB
            1GB
        
        
        
            %date %level [%thread] %logger{36} [%file : %line] %msg%n
            
        
    

    
    
        
        
    

    
    
        
        
    


1.3工具类

public class Slf4jService {
    
    //默认会去类路径下找名为logback.xml的配置文件
    private static final Logger logger = LoggerFactory.getLogger(Slf4jService.class);

    public void testAPI(){
        //输出日志
        logger.trace("trace信息");
        logger.debug("debug");
        logger.info("info信息");
        logger.warn("warn");
        logger.error("error");
    }
}

1.4测试

  @Test
    public void test1(){
        Slf4jService service = new Slf4jService();
        service.testAPI();
    }
结果打印:
16:27:58.828 logback [main] INFO  com.suisui.slf4j.Slf4jService - info信息
16:27:58.831 logback [main] WARN  com.suisui.slf4j.Slf4jService - warn
16:27:58.831 logback [main] ERROR com.suisui.slf4j.Slf4jService - error
2.slf4j适配到log4j输出

2.1依赖

   
            org.slf4j
            slf4j-api
            1.7.25
        
      
            org.slf4j
            slf4j-log4j12
            1.7.25
        

2.2log4j.properties同jcl 2.2
2.3-2.4同上

结果输出
2022-08-03 16:30:48 INFO  com.suisui.slf4j.Slf4jService 18:info信息 
2022-08-03 16:30:48 WARN  com.suisui.slf4j.Slf4jService 19:warn 
2022-08-03 16:30:48 ERROR com.suisui.slf4j.Slf4jService 20:error 
转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036890.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号