1.导入依赖
log4j2也是一种日志门面技术,但主流依然是slf4j
已经导入了slf4j的日志门面依赖,为什么还要导入log4j2的日志门面,如下:
1.导入slf4j的日志门面 2.导入log4j2的适配器 3.导入log4j2的日志门面 4.导入log4j2的日志实现 执行原理: slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现
<!-- slf4j日志门面 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <!-- log4j适配器 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.12.1</version> </dependency> <!-- log4j2日志门面 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.12.1</version> </dependency> <!-- log4j2日志实现 --> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.12.1</version> </dependency>
异步日志的实现方式-->1
异步日志实现(单独分配线程做日志的记录) 方式1:使用AsyncAppender的方式 1.添加异步日志依赖 2.在Appenders标签中,对于异步进行配置 使用Async标签 3.rootlogger引用Async
异步日志依赖
<!-- 异步日志依赖 --> <dependency> <groupId>com.lmax</groupId> <artifactId>disruptor</artifactId> <version>3.3.7</version> </dependency>
log4j2.xml配置
<!-- 配置appender --> <Appenders> <!-- 配置控制台输出 --> <Console name="consoleAppender" target="SYSTEM_OUT"> </Console> <!-- 配置异步日志 --> <Async name="myAsync"> <!--将控制台输出做异步的操作--> <AppenderRef ref="consoleAppender"/> </Async> </Appenders> <!-- 配置logger --> <Loggers> <!-- 配置rootlogger --> <Root level="trace"> <!-- 引用Appender --> <AppenderRef ref="myAsync"/> </Root> </Loggers>
异步日志的实现方式-->2
异步日志实现(单独分配线程做日志的记录) 方式2:使用AsyncLogger的方式 全局异步 所有的日志都是异步的日志记录,在配置文件上不用做任何的改动 只需要在类路径resources下添加一个properties属性文件,做一步配置即可 文件名要求是:log4j2.component.properties 内容是:Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector
需求:
异步日志实现(单独分配线程做日志的记录) 方式2:使用AsyncLogger的方式 混合异步: 可以在应用中同时使用同步日志和异步日志,这使得日志的配置及输出会更加的灵活 需求: 假设我们现在有自定义的logger -- com.bjpowernode 让自定义的logger是异步的 让rootlogger是同步的 注意: 在做测试前,一定要将全局的异步配置注释掉 对于当前的logger,Log4j2Test01.class Log4j2Test01本身就是在我们自定义的logger路径下的 注意: 如果使用异步日志 AsyncAppender、AsyncLogger不要同时出现,没有这个需求,效果也不会叠加 如果同时出现,那么效率会以AsyncAppender为主 AsyncLogger的全局异步和混合异步也不要同时出现,没有这个需求,效果也不会叠加
test代码:
Logger logger = LoggerFactory.getLogger(Log4j2Test01.class); //日志的记录 for (int i = 0; i < 2000; i++) { logger.error("error信息"); logger.warn("warn信息"); logger.info("info信息"); logger.debug("debug信息"); logger.trace("trace信息"); } //系统业务逻辑 //在进行异步日志实现时加入,体现出效果 for (int i = 0; i < 1000; i++) { System.out.println("------------------"); }
完整的log4j2.xml配置
<?xml version="1.0" encoding="UTF-8"?> <Configuration> <!-- 配置全局通用属性 --> <properties> <property name="logDir">D://test</property> </properties> <!-- 配置appender --> <Appenders> <!-- 配置控制台输出 --> <Console name="consoleAppender" target="SYSTEM_OUT"> </Console> <!-- 配置文件输出--> <File name="fileAppender" fileName="${logDir}//log4j2.log"> <!-- 配置文件输出格式 --> <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/> </File> <!-- 按照指定规则来拆分日志文件 fileName:日志文件的名字 filePattern:日志文件拆分后文件的命名规则 $${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹 例如:2021-01-01这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中) 2021-01-02这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中) rollog-%d{yyyy-MM-dd-HH-mm}-%i.log 为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复 --> <RollingFile name="rollingFile" fileName="${logDir}/rollog.log" filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log"> <!-- 日志消息格式 --> <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/> <Policies> <!-- 在系统启动时,触发拆分规则,产生一个日志文件 --> <OnStartupTriggeringPolicy/> <!-- 按照文件的大小进行拆分 --> <SizeBasedTriggeringPolicy size="10KB"/> <!-- 按照时间节点进行拆分 拆分规则就是filePattern--> <TimeBasedTriggeringPolicy/> </Policies> <!-- 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则--> <DefaultRolloverStrategy max="30"/> </RollingFile> <!-- 配置异步日志 --> <!--<Async name="myAsync"> <!–将控制台输出做异步的操作–> <AppenderRef ref="consoleAppender"/> </Async>--> </Appenders> <!-- 配置logger --> <Loggers> <!-- 自定义logger,让自定义的logger为异步logger --> <!-- includeLocation="false" 表示去除日志记录中的行号信息,这个行号信息非常的影响日志记录的效率(生产中都不加这个行号) 严重的时候可能记录的比同步的日志效率还有低 additivity="false" 表示不继承rootlogger --> <AsyncLogger name="com.bjpowernode" level="trace" includeLocation="false" additivity="false"> <!-- 将控制台输出consoleAppender,设置为异步打印 --> <AppenderRef ref="consoleAppender"/> </AsyncLogger> <!-- 配置rootlogger --> <Root level="trace"> <!-- 引用Appender --> <!--<AppenderRef ref="consoleAppender"/>--> <!--<AppenderRef ref="fileAppender"/>--> <!--<AppenderRef ref="rollingFile"/>--> <!--<AppenderRef ref="myAsync"/>--> <AppenderRef ref="consoleAppender"/> </Root> </Loggers> </Configuration>