log4j中Logger.getLogger为什么一定要加载一个类

  /**
   * Retrieve a logger named according to the value of the
   * <code>name</code> parameter. If the named logger already exists,
   * then the existing instance will be returned. Otherwise, a new
   * instance is created.  
   *
   * <p>By default, loggers do not have a set level but inherit it
   * from their neareast ancestor with a set level. This is one of the
   * central features of log4j.
   *
   * @param name The name of the logger to retrieve.  
  */
  static
  public
  Logger getLogger(String name) {
    return LogManager.getLogger(name);
  }

  /**
   * Shorthand for <code>getLogger(clazz.getName())</code>.
   *
   * @param clazz The name of <code>clazz</code> will be used as the
   * name of the logger to retrieve.  See {@link #getLogger(String)}
   * for more detailed information.
   */
  static
  public
  Logger getLogger(Class<?> clazz) {
    return LogManager.getLogger(clazz.getName());
  }

源码可以看出  ---不管是传的  
Class<?> clazz 还是String  最后给getLogger的都是String  

也就是说 
private static Logger logger = LogManager.getLogger(TestTidebuy.class.getName());
private static Logger logger = LogManager.getLogger(TestTidebuy.class);
是一样的

配合log4j.properties中  %d{HH:mm:ss.SSS} %-5level %c{1} %L %M - %msg%xEx%n  的<pre name="code" class="java"> %c{1}
private static Logger logger = LogManager.getLogger(Test.class);   这个对应的输出
23:13:15.921 INFO  Test 11 main - 开始程序.
23:13:15.921 ERROR Test 15 main - hello
private static Logger logger = LogManager.getLogger(HelloLog4j.class);    这个对应的输出
23:13:39.593 INFO  HelloLog4j 11 main - 开始程序.
23:13:39.593 ERROR HelloLog4j 15 main - hello

 

测试代码如下:
<pre name="code" class="html"><?xml version="1.0" encoding="UTF-8"?>

<configuration status="error">
    <!--先定义所有的appender-->
    <appenders>
        <!--这个输出控制台的配置-->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY"/>
            <!--这个都知道是输出日志的格式-->
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %c{1} %L %M - %msg%xEx%n"/>
        </Console>
        <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用-->
        <File name="log" fileName="log/test.log" append="false">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n"/>
        </File>

        <!--这个会打印出所有的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
        <RollingFile name="RollingFile" fileName="logs/app.log"
                     filePattern="log/$${date:yyyy-MM}/app-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d{yyyy-MM-dd 'at' HH:mm:ss z} %-5level %class{36} %L %M - %msg%xEx%n"/>
            <SizeBasedTriggeringPolicy size="50MB"/>
        </RollingFile>
    </appenders>
    <!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
    <loggers>
        <!--建立一个默认的root的logger-->
        <root level="trace">
            <appender-ref ref="RollingFile"/>
            <appender-ref ref="Console"/>
        </root>

    </loggers>
</configuration>

package log4j;

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

public class Test {
	private static Logger logger = LogManager.getLogger(HelloLog4j.class);   
	
	public static void main(String[] args) {
		System.out.println(HelloLog4j.class.getName());
        logger.info("开始程序.");
//        HelloLog4j hello= new HelloLog4j();
       // for (int i = 0; i < 10000;i++){
//            if (!hello.hello()) {
                logger.error("hello");
//            }    // }
//        logger.trace("退出程序.");
    }
}

package log4j;

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

public class Test {
	private static Logger logger = LogManager.getLogger(Test.class);   
	
	public static void main(String[] args) {
		System.out.println(HelloLog4j.class.getName());
        logger.info("开始程序.");
//        HelloLog4j hello= new HelloLog4j();
       // for (int i = 0; i < 10000;i++){
//            if (!hello.hello()) {
                logger.error("hello");
//            }    // }
//        logger.trace("退出程序.");
    }
}


 


Slf4j本身并不提供配置文件,它仅提供了一个通用的日志接口。日志的具体实现和配置文件是由Slf4j的实现框架(如Logback、Log4j等)来提供和管理的。 下面是一个使用Logback作为Slf4j的实现框架的配置文件示例: 1. 创建一个名为`logback.xml`的配置文件(或者`logback.groovy`,根据具体的需求),并将其放置在路径下。 2. 在配置文件,可以定义不同的日志输出格式、日志级别、日志文件路径等。以下是一个基本的示例: ```xml <configuration> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="info"> <appender-ref ref="console" /> </root> </configuration> ``` 上述示例配置了一个名为`console`的`ConsoleAppender`,定义了日志输出格式的模式。`%d{HH:mm:ss.SSS}`表示时间戳,`[%thread]`表示线程名,`%-5level`表示日志级别,`%logger{36}`表示日志记录器名称(最多显示36个字符),`%msg%n`表示日志消息和换行符。 然后,通过`<root>`元素指定了根日志记录器的级别为`info`,并将`console` appender 添加到根日志记录器。 3. 在应用程序加载配置文件。加载配置文件的方式取决于使用的Slf4j实现框架。对于Logback,可以通过以下方式加载配置文件: ```java import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.core.util.StatusPrinter; import org.slf4j.LoggerFactory; public class LogbackConfigExample { public static void main(String[] args) { // 获取LoggerContext实例 LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); // 配置文件路径 String configFile = "logback.xml"; try { // 重新加载配置文件 loggerContext.reset(); loggerContext.configure(configFile); } catch (Exception e) { // 配置文件加载失败时打印异常信息 StatusPrinter.print(loggerContext); } // 使用Logger记录日志 org.slf4j.Logger logger = LoggerFactory.getLogger(LogbackConfigExample.class); logger.info("This is an info message"); } } ``` 在上述示例,我们首先通过`LoggerFactory.getILoggerFactory()`方法获取`LoggerContext`实例。然后,使用`reset()`方法重置`LoggerContext`,然后使用`configure()`方法加载指定的配置文件。 如果加载配置文件失败,可以通过`StatusPrinter.print(loggerContext)`方法打印错误信息。 最后,我们使用`LoggerFactory.getLogger()`方法获取`Logger`实例,并使用它记录日志。 请注意,具体的加载配置文件方法和配置文件格式可能因Slf4j的实现框架而异。上述示例针对使用Logback作为实现框架的情况,如果使用其他实现框架(如Log4j),则需要相应地修改加载配置文件的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值