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<FINEST<。。。SEVERE<OFF

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.导入依赖

<dependency>
   <groupId>log4j</groupId>
   <artifactId>log4j</artifactId>
   <version>1.2.17</version>
</dependency>

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

#rootLogger日志级别,stdout,a1,a2把logger和其他的具体的appender关联
log4j.rootLogger=INFO,stdout
#设置控制台appender:stdoutappender的名字,随便起
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天的日志:linuxcrontad
# 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());
    /**
     * 要使用log4j,必须有log4j的配置文件,默认在类路径下找log4j.properties
     * 否则报错
     * log4j:WARN No appenders could be found for logger (com.suisui.log4j.Log4jService).
       log4j:WARN Please initialize the log4j system properly.
       log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
     */
    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引入依赖

<dependency>
      <groupId>commons-logging</groupId>
      <artifactId>commons-logging</artifactId>
      <version>1.2</version>
</dependency>

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加入依赖

  <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
 </dependency>

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依赖

 <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>jcl-over-slf4j</artifactId>
      <version>1.7.25</version>
 </dependency>
 <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
</dependency>
<dependency>(单独引入这个也可)
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.3</version>
 </dependency>

1.2 logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>
    <!--可以自己定义变量,该文件后使用-->
    <property name="log.path" value="D:\logback.log" />

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!--输出格式 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n
            </pattern>
        </encoder>
    </appender>

    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件名称-->
            <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>1</maxHistory>
            <maxFileSize>100MB</maxFileSize>
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <!--日志文件格式-->
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <!--父级的logger设置-->
    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

    <!--精确到某个业务包  additivity="false"表示当前输出了,父级就不再输出了-->
    <logger name="com.suisui.slf4j" level="info" additivity="false">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </logger>

</configuration>

1.3工具

public class Slf4jService {
    /**
     * slf4j+logback 引入依赖slf4j+logback配置文件
     * slf4j+log4j 切换jar包+log4j.properties配置文件,删除logback配置文件
     */
    //默认会去类路径下找名为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依赖

   <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
      <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.25</version>
        </dependency>

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 

原文地址:https://blog.csdn.net/weixin_43994244/article/details/126140358

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_28222.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注