java多线程同步打印log_log4j2 异步多线程打印日志

本文介绍了如何使用Log4j2实现异步多线程打印日志,通过配置log4j2.xml和自定义ThreadLookup类,使得每个线程可以生成独立的日志文件,详细展示了相关代码实现和日志输出效果。
摘要由CSDN通过智能技术生成

log4j2 异步多线程打印日志

Maven依赖

org.apache.logging.log4j

log4j-1.2-api

2.3

org.apache.logging.log4j

log4j-api

2.3

org.apache.logging.log4j

log4j-core

2.3

com.lmax

disruptor

3.3.4

log4j2.xml

packages="com.hoperun.zhulongxiang.asnc_print_different_logfile">

fileName="log/${thread:threadName}.log"

filePattern="log/${thread:threadName}-%d{MM-dd-yyyy}-%i.log">

核心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中配置中的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中配置中的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下已经有了我们想要的以线程名命名的日志文件了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值