0、依赖
1、springboot 整合log4j2
1.1、pom.xml
<!--引入log4j2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--排除logging 排除其他日志实现-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
1.2、配置文件
默认读取log4j2.properties,
appender.console.type = Console
appender.console.name = console
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%d{ISO8601}][%-5p][%-2c] %marker%m%n
rootLogger.level = info
rootLogger.appenderRef.console.ref = console
application.yml 指定配置文件
logging:
level:
com.sgcc.dlsc.kafka.consumer.*: INFO
config: classpath:log4j2-test.xml
2、普通java程序中使用
2.1、依赖
<!--log4j和slf4j的连接包 需要绑定到log4j 2 core核心包上-->
<!--包含了log4j-core、slf4j-api,log4j-core又包含了log4j-api-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.3</version>
</dependency>
2.2、配置文件
需要在resources下添加配置文件,否则不会有输出
<?xml version="1.0" encoding="UTF-8"?>
<configuration status="error">
<properties>
<property name="LOG_HOME">logs</property>
<property name="PATTERN_LAYOUT_CONSOLE_ROOT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %highlight{[%-5level]} [%c{1.}.%M(%F:%L)] --- %highlight{%msg %xEx%n}</property>
<property name="PATTERN_LAYOUT_FILE_ROOT">%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{[%5p]} [%t] [%l] --- %highlight{%m%n}</property>
<property name="PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5level] --- %msg %xEx%n</property>
</properties>
<!--先定义所有的appender-->
<appenders>
<!--这个输出控制台的配置-->
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<!--这个是输出日志的格式-->
<PatternLayout charset="utf-8">
<MarkerPatternSelector defaultPattern="${PATTERN_LAYOUT_CONSOLE_ROOT}">
<PatternMatch key="UTIL" pattern="${PATTERN_LAYOUT}"/>
</MarkerPatternSelector>
</PatternLayout>
</Console>
</appenders>
<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--建立一个默认的root的logger-->
<root level="INFO">
<appender-ref ref="Console"/>
</root>
<!--建立一个默认的root的logger-->
<Logger name="com.lms.iec104" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</Logger>
</loggers>
</configuration>
2.3、使用
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
public static final Logger LOGGER = LoggerFactory.getLogger(Demo.class);
public static void main(String[] args) {
LOGGER.info("info...");
LOGGER.error("errof...");
}
}
可以使用@Slf4j 注解 这是lombok的一个注解
3、配置文件示例
通用配置
<configuration status="error" monitorInterval="10">
<properties>
<property name="LOG_HOME">logs</property>
<property name="PATTERN_LAYOUT_CONSOLE_ROOT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %highlight{[%-5level]} [%c{1.}.%M(%F:%L)] --- %highlight{%msg %xEx%n}</property>
<property name="PATTERN_LAYOUT_FILE_ROOT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%5p] [%t] [%l] --- %m%n</property>
<property name="PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%-5level] --- %msg %xEx%n</property>
</properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="utf-8">
<MarkerPatternSelector defaultPattern="${PATTERN_LAYOUT_CONSOLE_ROOT}">
<PatternMatch key="UTIL" pattern="${PATTERN_LAYOUT}"/>
</MarkerPatternSelector>
</PatternLayout>
</Console>
<RollingFile name="RollingFileERROR" fileName="${LOG_HOME}/system.log"
filePattern="${LOG_HOME}/error-%d{yyyy-MM-dd}-%i.log.gz"
bufferSize="4096" immediateFlush="true" bufferedIO="true" append="true">
<Filters>
<MarkerFilter marker="MESSAGE" onMatch="DENY" onMismatch="NEUTRAL"/>
<MarkerFilter marker="TRACE" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout charset="utf-8">
<MarkerPatternSelector defaultPattern="${PATTERN_LAYOUT_FILE_ROOT}">
<PatternMatch key="UTIL" pattern="${PATTERN_LAYOUT}"/>
</MarkerPatternSelector>
</PatternLayout>
<Policies>
<CronTriggeringPolicy schedule="0 0 0/12 * * ?"/>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="50">
<Delete basePath="${LOG_HOME}" testMode="false" maxDepth="5">
<IfFileName glob="error*.log.gz">
<IfLastModified age="180d">
<IfAny>
<IfAccumulatedFileSize exceeds="50GB"/>
<IfAccumulatedFileCount exceeds="1000"/>
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
</appenders>
<loggers>
<!-- 默认显示方式 -->
<root level="INFO">
<appender-ref ref="Console"/>
<!--<appender-ref ref="RollingFileSystem"/>-->
</root>
<Logger name="com" level="ERROR" additivity="false">
<!--生产环境将控制台去掉-->
<appender-ref ref="Console"/>
<appender-ref ref="RollingFileERROR"/>
</Logger>
<!--<Logger name="org.apache.kafka" level="ERROR"/> <!– avoid recursive logging –>-->
</loggers>
</configuration>
示例1:properties
status = error
dest = err
name = PropertiesConfig
property.filename = target/rolling/rollingtest.log
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = error
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
logger.rolling.name = com.example.my.app
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT
示例2:yaml
Configuration:
status: warn #控制台显示日志级别以上log4j2加载信息
name: YAMLConfigTest #配置文件名字
properties: #配置属性
property:
name: filename #文件名
value: target/test-yaml.log #值
thresholdFilter: #过滤器,输出应用程序的全局日志级别,低于的不会输出
level: error
appenders: #附加程序,定义日志输出的格式,目标(控制台、文件、socket等),
Console:
name: STDOUT
PatternLayout:
Pattern: "%m%n"
File:
name: File
fileName: ${filename} #文件
PatternLayout:
Pattern: "%d %p %C{1.} [%t] %m%n" #输出格式
Filters:
ThresholdFilter: #过滤器级别
level: error
RandomAccessFile:
- name: SQL_APPENDER
fileName: logs/sql.log
PatternLayout:
Pattern: "%d{ISO8601_BASIC} %-5level %logger{1} %X %msg%n"
- name: PAYLOAD_APPENDER
fileName: logs/payload.log
PatternLayout:
Pattern: "%d{ISO8601_BASIC} %-5level %logger{1} %X %msg%n"
- name: PERFORMANCE_APPENDER
fileName: logs/performance.log
PatternLayout:
Pattern: "%d{ISO8601_BASIC} %-5level %logger{1} %X %msg%n"
Routing:
name: ROUTING_APPENDER
Routes:
pattern: "$${marker:}"
Route:
- key: PERFORMANCE
ref: PERFORMANCE_APPENDER
- key: PAYLOAD
ref: PAYLOAD_APPENDER
- key: SQL
ref: SQL_APPENDER
Loggers:
# Root:
# level: trace
# AppenderRef:
# - ref: ROUTING_APPENDER
logger:
-
name: org.apache.logging.log4j.test1 #匹配org.apache.logging.log4j.test1以及它的所有子类
level: debug
additivity: false #不添加到root logger 中
ThreadContextMapFilter:
KeyValuePair:
key: test
value: 123
AppenderRef:
ref: STDOUT #匹配Appender
-
name: org.apache.logging.log4j.test2
level: debug
additivity: false
AppenderRef:
ref: File
Root: #必须配置root 记录器 ; 没有默认添加,级别为error,appender为控制台
level: trace
AppenderRef:
ref: STDOUT
示例3:log4j2.xml
<configuration status="error" monitorInterval="10">
<properties>
<property name="LOG_HOME">/logs</property>
<property name="PATTERN_LAYOUT_CONSOLE">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level --- %msg %xEx%n</property>
<property name="PATTERN_LAYOUT_CONSOLE_ROOT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level --- %c{1.}.%M(%F:%L) --- %msg %xEx%n</property>
<property name="PATTERN_LAYOUT">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level --- %msg %xEx%n</property>
<property name="BUSINESS_LEVEL">info</property>
<property name="SYSTEM_LEVEL">info</property>
</properties>
<appenders>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout charset="utf-8">
<MarkerPatternSelector defaultPattern="${PATTERN_LAYOUT_CONSOLE_ROOT}">
<PatternMatch key="UTIL" pattern="${PATTERN_LAYOUT_CONSOLE}"/>
</MarkerPatternSelector>
</PatternLayout>
</Console>
<RollingFile name="RollingFileSystem" fileName="${LOG_HOME}/system.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/$${date:yyyy-MM-dd}/system/system-%d{yyyy-MM-dd}-%i.log.gz"
bufferSize="4096" immediateFlush="true" bufferedIO="true" append="true">
<Filters>
<MarkerFilter marker="MESSAGE" onMatch="DENY" onMismatch="NEUTRAL"/>
<MarkerFilter marker="TRACE" onMatch="DENY" onMismatch="NEUTRAL"/>
<ThresholdFilter level="${SYSTEM_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout charset="utf-8">
<MarkerPatternSelector defaultPattern="${PATTERN_LAYOUT_CONSOLE_ROOT}">
<PatternMatch key="UTIL" pattern="${PATTERN_LAYOUT}"/>
</MarkerPatternSelector>
</PatternLayout>
<Policies>
<CronTriggeringPolicy schedule="0 0 0/12 * * ?"/>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="50">
<Delete basePath="${LOG_HOME}" testMode="false" maxDepth="5">
<IfFileName glob="*/*/system/system*.log.gz">
<IfLastModified age="180d">
<IfAny>
<IfAccumulatedFileSize exceeds="50GB"/>
<IfAccumulatedFileCount exceeds="1000"/>
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<RollingFile name="RollingFileBusiness" fileName="${LOG_HOME}/business.log"
filePattern="${LOG_HOME}/$${date:yyyy-MM}/$${date:yyyy-MM-dd}/business/business-%d{yyyy-MM-dd}-%i.log.gz"
bufferSize="4096" immediateFlush="true" bufferedIO="true" append="true">
<Filters>
<ThresholdFilter level="${BUSINESS_LEVEL}" onMatch="NEUTRAL" onMismatch="DENY"/>
<MarkerFilter marker="MESSAGE" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<MarkerFilter marker="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout charset="utf-8" pattern="${PATTERN_LAYOUT_CONSOLE}"/>
<Policies>
<CronTriggeringPolicy schedule="0 0 0/12 * * ?"/>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB"/>
</Policies>
<DefaultRolloverStrategy max="50">
<Delete basePath="${LOG_HOME}" testMode="false" maxDepth="5">
<IfFileName glob="*/*/business/business*.log.gz">
<IfLastModified age="180d">
<IfAny>
<IfAccumulatedFileSize exceeds="50GB"/>
<IfAccumulatedFileCount exceeds="1000"/>
</IfAny>
</IfLastModified>
</IfFileName>
</Delete>
</DefaultRolloverStrategy>
</RollingFile>
<Kafka name="KafkaSync" topic="audit" syncSend="true" ignoreExceptions="false">
<Filters>
<MarkerFilter marker="MESSAGE" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="${BUSINESS_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout charset="utf-8" pattern="${PATTERN_LAYOUT}"/>
<Property name="bootstrap.servers">192.168.20.69:11120</Property>
<Property name="timeout.ms">3000</Property>
<!--<Property name="max.block.ms">2000</Property>-->
</Kafka>
<Kafka name="KafkaTraceSync" topic="Trace" syncSend="true" ignoreExceptions="false">
<Filters>
<MarkerFilter marker="TRACE" onMatch="NEUTRAL" onMismatch="DENY"/>
<ThresholdFilter level="${BUSINESS_LEVEL}" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout charset="utf-8" pattern="${PATTERN_LAYOUT}"/>
<Property name="bootstrap.servers">192.168.20.69:11120</Property>
<Property name="timeout.ms">3000</Property>
<!--<Property name="max.block.ms">2000</Property>-->
</Kafka>
<File name="failoverKafkaLog" fileName="${LOG_HOME}/failover.log" ignoreExceptions="false" append="true">
<Filters>
<MarkerFilter marker="MESSAGE" onMatch="ACCEPT" onMismatch="NEUTRAL"/>
<MarkerFilter marker="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
</Filters>
<PatternLayout charset="utf-8" pattern="${PATTERN_LAYOUT}"/>
</File>
<Failover name="Failover" primary="KafkaSync" retryIntervalSeconds="15" >
<Failovers>
<appender-ref ref="failoverKafkaLog"/>
</Failovers>
</Failover>
<Failover name="FailoverTrace" primary="KafkaTraceSync" retryIntervalSeconds="15" >
<Failovers>
<appender-ref ref="failoverKafkaLog"/>
</Failovers>
</Failover>
</appenders>
<loggers>
<!-- 默认显示方式 -->
<root level="${SYSTEM_LEVEL}">
<appender-ref ref="Console"/>
<!--<appender-ref ref="RollingFileSystem"/>-->
</root>
<Logger name="com" level="${SYSTEM_LEVEL}" additivity="false">
<!--生产环境将控制台去掉-->
<appender-ref ref="Console"/>
<appender-ref ref="Failover"/>
<appender-ref ref="FailoverTrace"/>
<appender-ref ref="RollingFileSystem"/>
<appender-ref ref="RollingFileBusiness"/>
</Logger>
<Logger name="org.apache.kafka" level="INFO"/> <!-- avoid recursive logging -->
</loggers>
</configuration>
语法
配置文件语法:
advertiser:(可选)广告商插件名称,将用于广告各个FileAppender或SocketAppender配置。提供的唯一广告商插件是“ multicastdns”。
dest:stderr的“ err”,stdout的“ out”,文件路径或URL。
monitorInterval:在检查文件配置是否更改之前必须经过的最短时间(以秒为单位)。
name:配置的名称。
packages:用逗号分隔的软件包名称列表,用于搜索插件。每个类加载器仅加载一次插件,因此更改此值可能对重新配置没有任何影响。
schema:标识类加载器的位置,该位置用于定位XML模式以用于验证配置。仅在strict设置为true时有效。如果未设置,则不会进行任何模式验证
shutdownHook:指定在JVM关闭时Log4j是否应自动关闭。默认情况下,关闭挂钩是启用的,但可以通过将此属性设置为“禁用”来禁用
shutdownTimeout:指定关闭JVM时将关闭多少毫秒的附加程序和后台任务。默认值为零,这意味着每个追加程序都使用其默认超时,并且不等待后台任务。并非所有的追加程序都将遵守此规则,这只是提示,而不是绝对的保证,关闭过程不会花费更长的时间。将此值设置得太低会增加丢失尚未写入最终目标的未完成日志事件的风险。请参见LoggerContext.stop(long,java.util.concurrent.TimeUnit)。(如果shutdownHook设置为“禁用”,则不使用。)
status:应该记录到控制台的内部Log4j事件的级别。此属性的有效值为“ trace”,“ debug”,“ info”,“ warn”,“ error”和“ fatal”。Log4j将有关初始化,过渡和其他内部操作的详细信息记录到状态记录器中。如果需要对log4j进行故障排除,设置status =“ trace”是您可以使用的首批工具之一。
(或者,设置系统属性log4j2.debug还将向控制台输出内部Log4j2日志记录,包括在找到配置文件之前进行的内部日志记录。)
strict:启用严格XML格式的使用。JSON配置中不支持。
verbose:加载插件时启用诊断信息。
日志输出格式
%d表示日期时间,
%thread表示线程名,
%‐5level:级别从左显示5个字符宽度
%logger{50} 表示logger名字最长50个字符,否则按照句点分割。
%msg:日志消息,
%n是换行符
‐‐>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
# 颜色
%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{[%5p]} [%t] [%l] - %highlight{%m%n}
格式化符号说明:
%p:输出日志信息的优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
%d:输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,如:%d{yyyy/MM/dd HH:mm:ss,SSS}。
%r:输出自应用程序启动到输出该log信息耗费的毫秒数。
%t:输出产生该日志事件的线程名。
%l:输出日志事件的发生位置,相当于%c.%M(%F:%L)的组合,包括类全名、方法、文件名以及在代码中的行数。例如:test.TestLog4j.main(TestLog4j.java:10)。
%c:输出日志信息所属的类目,通常就是所在类的全名。
%M:输出产生日志信息的方法名。
%F:输出日志消息产生时所在的文件名称。
%L::输出代码中的行号。
%m::输出代码中指定的具体日志信息。
%n:输出一个回车换行符,Windows平台为"rn",Unix平台为"n"。
%x:输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
%%:输出一个"%"字符。
另外,还可以在%与格式字符之间加上修饰符来控制其最小长度、最大长度、和文本的对齐方式。如:
1) c:指定输出category的名称,最小的长度是20,如果category的名称长度小于20的话,默认的情况下右对齐。
2)%-20c:"-"号表示左对齐。
3)%.30c:指定输出category的名称,最大的长度是30,如果category的名称长度大于30的话,就会将左边多出的字符截掉,但小于30的话也不会补空格。
————————————————
版权声明:本文为CSDN博主「跳动的数字」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_36269396/article/details/113026181
application.yml
logging:
level:
com:
sgcc: info
file:
path: #指定路径,默认当前项目
name: D:/springboot.log #指定文件路径及名字,默认名字spring.log ,建议使用这个
pattern:
console: '%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n' #yaml解析 需要用''引起来
file: '%d{yyyy-MM-dd } ==== [%thread] %-5level %logger{50} ========%msg%n' #文件输出格式