log4j2 异步多线程打印日志
log4j2 异步多线程打印日志
Maven依赖
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.3</version>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.3.4</version>
</dependency>
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn"
packages="com.hoperun.zhulongxiang.asnc_print_different_logfile">
<Appenders>
<console name="console" target="system_out">
<!-- 只输出level及以上级别的信息(onmatch),其他的直接拒绝(onmismatch)。默认就是trace。
<thresholdfilter
level="trace" onmatch="accept" onmismatch="deny"/> -->
<patternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} -
%m%n" />
</console>
<Routing name="Routing">
<Routes pattern="$${thread:threadName}">
<Route>
<RollingFile name="logFile-${thread:threadName}"
fileName="log/${thread:threadName}.log"
filePattern="log/${thread:threadName}-%d{MM-dd-yyyy}-%i.log">
<PatternLayout pattern="%d %-5p [%t] %C{2} - %m%n" />
<Policies>
<SizeBasedTriggeringPolicy size="50 MB" />
</Policies>
<DefaultRolloverStrategy max="100" />
</RollingFile>
</Route>
</Routes>
</Routing>
<Async name="async" bufferSize="1000" includeLocation="true">
<AppenderRef ref="Routing" />
<AppenderRef ref="console" />
</Async>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="async" />
</Root>
</Loggers>
</Configuration>
核心java类
package com.hoperun.zhulongxiang.asnc_print_different_logfile;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;
@Plugin(name = "thread", category = StrLookup.CATEGORY)
public class ThreadLookup implements StrLookup {
public String lookup(String key) {
return Thread.currentThread().getName();
}
public String lookup(LogEvent event, String key) {
return event.getThreadName() == null ? Thread.currentThread().getName() : event.getThreadName();
}
}
这里@Plugin中的name的值对应log4j2.xml中<Routes pattern="$${thread:threadName}">配置中的thread
准备两个线程类
package com.hoperun.zhulongxiang.asnc_print_different_logfile;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class LogThread implements Runnable {
private static final Logger LOGGER = LogManager.getLogger(LogThread.class);
public String threadName;
public LogThread(String threadName) {
this.threadName = threadName;
}
public void run() {
Thread.currentThread().setName(threadName);
LOGGER.info("1");
}
}
package com.hoperun.zhulongxiang.asnc_print_different_logfile;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class OtherLogThread implements Runnable {
private static final Logger LOGGER = LogManager.getLogger(LogThread.class);
public String threadName;
public OtherLogThread(String threadName) {
this.threadName = threadName;
}
public void run() {
Thread.currentThread().setName(threadName);
LOGGER.info("2");
}
}
测试
package com.hoperun.zhulongxiang.asnc_print_different_logfile;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.ThreadContext;
import org.nutz.ioc.Ioc;
import com.hoperun.base.IocMaster;
public class LogApp {
static {
System.setProperty("log4j.configurationFile", "etc/log4j2.xml");
}
private static final Logger LOGGER = LogManager.getLogger(LogApp.class);
public static void main(String[] args) {
ThreadContext.put("threadName", Thread.currentThread().getName());
LogThread t1 = new LogThread("123123123");
OtherLogThread t2 = new OtherLogThread("4564564564");
ExecutorService pool = Executors.newFixedThreadPool(20);
pool.submit(t1);
pool.submit(t2);
}
}
这里ThreadContext.put("threadName", Thread.currentThread().getName())设置的参数threadName对应log4j2.xml中<Routes pattern="$${thread:threadName}">配置中的threadName
日志
09:44:39.704 [123123123] INFO com.hoperun.zhulongxiang.asnc_print_different_logfile.LogThread - 1
09:44:39.704 [4564564564] INFO com.hoperun.zhulongxiang.asnc_print_different_logfile.LogThread - 2
日志中的线程名已经修改成我们设定的名称。log下已经有了我们想要的以线程名命名的日志文件了。
log4j2 异步多线程打印日志的更多相关文章
- 一次鞭辟入里的 Log4j2 异步日志输出阻塞问题的定位
一次鞭辟入里的 Log4j2 日志输出阻塞问题的定位 问题现象 线上某个应用的某个实例突然出现某些次请求服务响应极慢的情况,有几次请求超过 60s 才返回,并且通过日志发现,服务线程并没有做什么很重的 ...
- Log4j2中的同步日志与异步日志
1.背景 Log4j 2中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用AsyncAppender和使用AsyncLogger两种方式. 2.Log4j2中的同步日志 所谓同步日 ...
- log4j2异步日志配置及官方文档的问题澄清
配置及demo 方法一全部打开 加启动参数 -DLog4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextS ...
- log4j2异步日志解读(二)AsyncLogger
前文已经讲了log4j2的AsyncAppender的实现[log4j2异步日志解读(一)AsyncAppender],今天我们看看AsyncLogger的实现. 看了这个图,应该很清楚AsyncLo ...
- 使用log4j2打印Log,log4j不能打印日志信息,log4j2不能打印日志信息,log4j和logj2,idea控制台信息乱码(文末)
说来惭愧,今天就写了个"hello world",了解了一下log4j的日志. 本来是想在控制台打印个log信息,也是遇到坎坷重重,开始也没去了解log4j就来使用,log4j配置 ...
- Log4j2异步情况下怎么防止丢日志的源码分析以及队列等待和拒绝策略分析
org.apache.logging.log4j.core.async.AsyncLoggerConfigDisruptor以下所有源码均在此类中首先我们看下log4j2异步队列的初始化 从这里面我们 ...
- log4j2异步日志解读(一)AsyncAppender
log4j.logback.log4j2 历史和关系,我们就在这里不展开讲了.直接上干货,log4j2突出于其他日志的优势,异步日志实现. 看一个东西,首先看官网文档 ,因为前面文章已经讲解了disr ...
- 如何监控 Log4j2 异步日志遇到写入瓶颈
如何监控 Log4j2 异步日志遇到写入瓶颈 在之前的一篇文章中(一次鞭辟入里的 Log4j2 异步日志输出阻塞问题的定位),我们详细分析了一个经典的 Log4j2 异步日志阻塞问题的定位,主要原因还 ...
- 使用 @Log4j2 log.error() 打印异常日志
public static void main(String[] args) { int a = 10; try { int i = 1/0; } catch (Exception e) { Syst ...
随机推荐
- Java进阶学习(5)之设计原则(下)
框架加数据 把数据的硬编码尽可能解成框架加数据的结构 城堡游戏修改后的代码 Room类 package com.castle; import java.util.HashMap; public cla ...
- 树莓派学习之路-GPIO Zero
原来用的都是RPi.GPIO模式开发,写程序 今天看到了GPIOZERO的资料,觉得这个API还是很好用的, 唯一的缺点就是官方资料是英文的,而且目前这方面的资料也不多, 所以开始写这篇博文,将自己学 ...
- Ansible - playbook - 概要
概述 简单描述 ansible playbook 1. playbook 概述 ansible 的 "脚本" 场景 ansible 单条命令, 执行一个操作 问题 如果执行多个操作 ...
- Git - 06. git checkout
1. 概述 已经学会查看 提交记录 尝试在 提交记录 之间做跳转 2. 命令 跳转到提交 概述 跳转到 日志 里的某次提交 命令 # 撤销 工作区的所有改动, 返回 当前分支 的 上一个提交 > ...
- 「JSOI2015」isomorphism
「JSOI2015」isomorphism 传送门 我们还是考虑树哈希来判同构. 但是我们需要使用一些特殊的手段来特殊对待假节点. 由于是无向树,我们首先求出重心,然后以重心为根跑树哈希. 此处我们不 ...
- Navicat Premium 12安装、激活
Navicat Premium 12安装 Navicat Premium 12激活
- 读书小记--<态度>
前言 前段时间再读了吴军老师的<态度>,分享的是和女儿的日常书信.觉得收获很多,同时推荐他的<浪潮之巅><数学之美><大学之路>系列书籍. 下面是个人的 ...
- anacondaPython3.7退回到Python3.6
https://blog.csdn.net/Fhujinwu/article/details/85851587
- 推荐 C/C++ 人工智能 框架和库
2018年10月22日 22:59:58 yangminggg 阅读数:2217 值得推荐的C/C++框架和库 C++资源大全 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web ...
- redis-py相关
一 redis客户端命令 cmd进入redis客户端管理程序路径xx:\windows redis\redis-2.4.0-win32-win64\64bit 执行:redis-cli.exe -h ...