일반적으로 사용되는 로깅 프레임워크
java.util.logging: JDK 버전 1.4에서 도입된 Java 네이티브 로깅 프레임워크입니다.
Log4j: 로그 대상을 제어할 수 있는 Apache의 오픈 소스 프로젝트 정보 전송 콘솔, 파일, GUI 구성요소 등은 각 로그의 출력 형식을 제어할 수 있으며 이는 애플리케이션 코드를 수정하지 않고도 구성 파일을 통해 유연하게 구성할 수 있습니다. 유지보수는 중단되었지만 현재 대부분의 기업에서는 log4j를 사용하고 있습니다.
LogBack: Log4j의 개선된 버전입니다
Log4j2: Log4j2는 Log4j의 업그레이드 버전이 아니라 처음부터 끝까지 다시 작성되었습니다
log Facade slf4j
The 위에서는 일부 로그 프레임워크의 구현을 소개합니다. 여기서는 시스템과 로그 구현 프레임워크 간의 결합을 해결하기 위해 로그 파사드를 사용해야 합니다. Java용 Simple Logging Facade인 SLF4J는 실제 로깅 구현이 아니라 백그라운드에서 모든 로깅 구현을 사용할 수 있게 해주는 추상화 계층입니다.
앞서 소개한 여러 로그 프레임워크와 마찬가지로 각 로그 프레임워크에는 해당 프레임워크를 사용하려면 해당 API를 사용해야 하며, 이로 인해 로그 프레임워크에 대한 애플리케이션 코드의 필요성이 크게 늘어납니다.
애플리케이션의 경우 slf4j를 사용한 후 기본 로깅 프레임워크가 어떻게 변경되더라도 애플리케이션은 코드 한 줄도 수정하지 않고 직접 온라인으로 전환할 수 있습니다.
log4j2를 선택하는 이유
다른 로그 시스템과 비교하여 log4j2는 데이터 손실이 적습니다. 다중 스레드 환경에서는 동시성 기능 등을 활용하여 성능이 10배 이상 높습니다. log4j2의 성능이 뛰어난 이유는 log4j2가 logback 및 log4j 이전에 대기열을 대체하기 위해 잠금이 없는 스레드 간 통신 라이브러리인 LMAX를 사용하기 때문입니다.
통합 단계Jar 패키지 소개
springboot는 기본적으로 로그백 로깅 프레임워크를 사용하므로 로그백을 제외해야 합니다. 그렇지 않으면 jar 종속성 충돌을 보고하는 오류가 발생합니다.
<dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-web</artifactid> <exclusions><!-- 去掉springboot默认配置 --> <exclusion> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-logging</artifactid> </exclusion> </exclusions> </dependency> <dependency> <!-- 引入log4j2依赖 --> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-log4j2</artifactid> </dependency>구성 파일
파일 이름을 사용자 정의하는 경우 application.yml에서 구성해야 합니다.
logging: config: xxxx.xml level: cn.jay.repository: trace
기본 이름은 log4j2-spring.xml이며, 이는 구성 파일 템플릿을 application.yml
에 저장합니다.
log4j는 .properties 파일을 기본 구성 파일로 사용하지만 이제 log4j2는 이 방법을 포기하고 이를 위해 .xml, .json 또는 .jsn을 사용합니다. 아마도 이것도 기술의 불가피성입니다. 속성 파일의 가독성이 정말 낮기 때문입니다.
<?xml version="1.0" encoding="UTF-8"?> <!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出--> <!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数--> <configuration> <!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL --> <!--变量配置--> <properties> <!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符--> <!-- %logger{36} 表示 Logger 名字最长36个字符 --> <property></property> <!-- 定义日志存储的路径,不要配置相对路径 --> <property></property> <property></property> </properties> <appenders> <console> <!--输出日志的格式--> <patternlayout></patternlayout> <!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <thresholdfilter></thresholdfilter> </console> <!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用--> <file> <patternlayout></patternlayout> </file> <!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <rollingfile> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <thresholdfilter></thresholdfilter> <patternlayout></patternlayout> <policies> <!--interval属性用来指定多久滚动一次,默认是1 hour--> <timebasedtriggeringpolicy></timebasedtriggeringpolicy> <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy> </policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <defaultrolloverstrategy></defaultrolloverstrategy> </rollingfile> <!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <rollingfile> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <thresholdfilter></thresholdfilter> <patternlayout></patternlayout> <policies> <!--interval属性用来指定多久滚动一次,默认是1 hour--> <timebasedtriggeringpolicy></timebasedtriggeringpolicy> <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy> </policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <defaultrolloverstrategy></defaultrolloverstrategy> </rollingfile> <!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档--> <rollingfile> <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)--> <thresholdfilter></thresholdfilter> <patternlayout></patternlayout> <policies> <!--interval属性用来指定多久滚动一次,默认是1 hour--> <timebasedtriggeringpolicy></timebasedtriggeringpolicy> <sizebasedtriggeringpolicy></sizebasedtriggeringpolicy> </policies> <!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖--> <defaultrolloverstrategy></defaultrolloverstrategy> </rollingfile> </appenders> <!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。--> <!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效--> <loggers> <!--过滤掉spring和mybatis的一些无用的DEBUG信息--> <logger> <appenderref></appenderref> </logger> <!--监控系统信息--> <!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。--> <logger> <appenderref></appenderref> </logger> <root> <appender-ref></appender-ref> <appender-ref></appender-ref> <appender-ref></appender-ref> <appender-ref></appender-ref> <appender-ref></appender-ref> </root> </loggers> </configuration>구성 매개변수 소개
일반적으로 사용되는 구성 매개변수에 대한 간략한 소개입니다
로그 수준
%d{yyyy-MM-dd HH:mm:ss, SSS} : 日志生产时间,输出到毫秒的时间 %-5level : 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0 %c : logger的名称(%logger) %t : 输出当前线程名称 %p : 日志输出格式 %m : 日志内容,即 logger.info("message") %n : 换行符 %C : Java类名(%F) %L : 行号 %M : 方法名 %l : 输出语句所在的行数, 包括类名、方法名、文件名、行数 hostName : 本地机器名 hostAddress : 本地ip地址Log4j2 구성 세부 정보
루트 노드 구성
에는 두 가지 속성이 있습니다.
monitorinterval은 log4j 자동 재구성을 위한 모니터링 간격을 지정하는 데 사용되며 단위는 s, 최소값은 5s입니다.
Appenders 노드
에는 일반적으로 Console, RollingFile, File
Console 노드가 세 개의 하위 노드가 있습니다. 컨트롤 대만의 Appender에 대한 출력을 정의합니다.
name: Appender의 이름을 지정합니다. fileName:指定输出日志的目的文件带全路径的文件名. PatternLayout:输出格式,不设置默认为:%m%n. RollingFile节点用来定义超过指定条件自动删除旧的创建新的Appender. name:指定Appender的名字. fileName:指定输出日志的目的文件带全路径的文件名. PatternLayout:输出格式,不设置默认为:%m%n. filePattern : 指定当发生Rolling时,文件的转移和重命名规则. Policies:指定滚动日志的策略,就是什么时候进行新建日志文件输出日志. TimeBasedTriggeringPolicy:Policies子节点,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1 hour。modulate=true用来调整时间:比如现在是早上3am,interval是4,那么第一次滚动是在4am,接着是8am,12am...而不是7am. SizeBasedTriggeringPolicy:Policies子节点,基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小. DefaultRolloverStrategy:用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)。 Loggers节点,常见的有两种:Root和Logger. Root节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出 level:日志输出级别,共有8个级别,按照从低到高为:All Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。 level:日志输出级别,共有8个级别,按照从低到高为:All name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点. AppenderRef:Logger的子节点,用来指定该日志输出到哪个Appender,如果没有指定,就会默认继承自Root.如果指定了,那么会在指定的这个Appender和Root的Appender中都会输出,此时我们可以设置Logger的additivity="false"只在自定义的Appender中进行输出。 简单使用 使用lombok工具简化创建Logger类 lombok就是一个注解工具jar包,能帮助我们省略一繁杂的代码。具体介绍可以看我的这篇教程。 使用lombok后下面的代码等效于上述的代码,这样会更方便的使用日志。
public class LogExampleOther {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExampleOther.class);
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
@Slf4j
public class LogExampleOther {
public static void main(String... args) {
log.error("Something else is wrong here");
}
}
위 내용은 Springboot에서 log4j2 로깅을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!