为线程配置 log4j2

2023-11-29

有一个类叫做Test,它延伸自Thread。如何配置 log4j2 以便为每个测试线程创建我自己的日志文件。

我正在尝试这样做:

public class Test extends Thread {

private String name;

private Logger LOGGER;

public Test(String name) {
    this.name=name;
}

@Override
public void run() {

    System.setProperty("taskLogFolder", Global.getInstance().getLogRoot().toString());
    System.setProperty("taskLogName", name);

    LoggerContext loggerContext = Configurator.initialize(name, new File(Global.getInstance().getAppRoot()+WEB_INF_DIR+"taskLog4j2.xml").toString());

    LOGGER = loggerContext.getLogger(name);

    for(int i=0;i<100;i++) {
        LOGGER.info(LOGGER.getName()+" "+i);
    }

    //LOGGER.info(LOGGER.getName());

}

}

但启动时会输出一个文件。

new Test("task-8").start();
new Test("task-2").start();
new Test("task-3").start();
new Test("task-4").start();
new Test("task-5").start();
new Test("task-6").start();
new Test("task-7").start();

早些时候我使用了 log4j 并在那里做到了,但我不明白如何做。

我究竟做错了什么?

taskLog4j2.xml file:

    <?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval = "30">

    <Properties>
        <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [thread-id %T] %l - %msg%n</Property>
    </Properties>

    <Appenders>
        <RollingFile name="fileLogger" fileName="${sys:taskLogFolder}/${sys:taskLogName}.log" filePattern="${sys:taskLogFolder}/${sys:taskLogName}-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>${pattern}</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="info" additivity="false">
            <appender-ref ref="console" />
            <appender-ref ref="fileLogger" />
        </Root>
        <Logger name="com.test.*" level="info">
            <appender-ref ref="fileLogger" level="info" />
        </Logger>
    </Loggers>

</Configuration>

对于@Sudheera 的回答

2017-12-12 22:22:46,942 task-3 ERROR Unable to invoke factory method in class org.apache.logging.log4j.core.appender.RollingFileAppender for element RollingFile: java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender java.lang.IllegalStateException: No factory method found for class org.apache.logging.log4j.core.appender.RollingFileAppender
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.findFactoryMethod(PluginBuilder.java:229)
at org.apache.logging.log4j.core.config.plugins.util.PluginBuilder.build(PluginBuilder.java:134)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createPluginObject(AbstractConfiguration.java:958)
at org.apache.logging.log4j.core.config.AbstractConfiguration.createConfiguration(AbstractConfiguration.java:898)
at org.apache.logging.log4j.core.appender.routing.RoutingAppender.createAppender(RoutingAppender.java:271)
at org.apache.logging.log4j.core.appender.routing.RoutingAppender.getControl(RoutingAppender.java:255)
at org.apache.logging.log4j.core.appender.routing.RoutingAppender.append(RoutingAppender.java:225)
at org.apache.logging.log4j.core.config.AppenderControl.tryCallAppender(AppenderControl.java:156)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender0(AppenderControl.java:129)
at org.apache.logging.log4j.core.config.AppenderControl.callAppenderPreventRecursion(AppenderControl.java:120)
at org.apache.logging.log4j.core.config.AppenderControl.callAppender(AppenderControl.java:84)
at org.apache.logging.log4j.core.config.LoggerConfig.callAppenders(LoggerConfig.java:448)
at org.apache.logging.log4j.core.config.LoggerConfig.processLogEvent(LoggerConfig.java:433)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:417)
at org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:403)
at org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146)
at org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLogger.java:2116)
at org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2100)
at org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:1994)
at org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1966)
at org.apache.logging.log4j.spi.AbstractLogger.info(AbstractLogger.java:1303)
at com.test.Test.run(Test.java:20)

您可以编写一个 Log4J 配置插件来进行自定义名称查找,并通过路由器配置使用它。这是适合您的固定代码。我已经添加了Log4jThreadLookup用于从 log4j 配置上下文中查找线程名称的类。只需确保该类在类路径中可用即可。我还更改了配置文件和Test类也是如此。

Log4jThreadLookup 类

package com.test;

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 Log4jThreadLookup implements StrLookup {

    public String lookup(String key) {
        return Thread.currentThread().getName();
    }

    public String lookup(LogEvent event, String key) {
        return event.getThreadName();
    }

}

配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" monitorInterval = "30">

    <Properties>
        <Property name="pattern">%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [thread-id %T] %l - %msg%n</Property>
    </Properties>

    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${thread:threadName}">
                <Route>
                    <RollingFile name="logFile-${thread:threadName}"
                                 fileName="logs/tasks-${thread:threadName}.log" filePattern="logs/tasks-${thread:threadName}-%d{yyyy-MM-dd}.log">
                        <PatternLayout>
                            <pattern>${pattern}</pattern>
                        </PatternLayout>
                        <Policies>
                            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                        </Policies>
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout pattern="${pattern}" />
        </Console>
    </Appenders>

    <Loggers>
        <Root level="info" additivity="false">
            <appender-ref ref="console" />
            <appender-ref ref="Routing" />
        </Root>
        <Logger name="com.test.*" level="info">
            <appender-ref ref="Routing" level="info" />
        </Logger>
    </Loggers>

</Configuration>

测试班

package com.test;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Test extends Thread {

    private static final Logger LOGGER = LogManager.getLogger(Test.class);
    private final String name;

    public Test(String name) {
        this.name = name;
    }

    @Override
    public void run() {
        Thread.currentThread().setName(name);

        for (int i = 0; i < 100; i++) {
            LOGGER.info(LOGGER.getName() + " " + i);
        }

    }
}

output

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为线程配置 log4j2 的相关文章

  • 与 Eclipse 中的 Java Content Assist 交互

    作为我的插件项目的一部分 我正在考虑与 Eclipse 在 Java 文件上显示的内容辅助列表进行交互 我正在尝试根据一些外部数据对列表进行重新排序 我看过一些有关创建新内容辅助的教程 但没有看到有关更改现有内容辅助的教程 这可能吗 如果是
  • eclipse行号状态行贡献项是如何实现的?

    我需要更新状态行编辑器特定的信息 我已经有了自己的实现 但我想看看 eclipse 贡献项是如何实现的 它显示状态行中的行号 列位置 谁能指点一下 哪里可以找到源代码 提前致谢 亚历克斯 G 我一直在研究它 它非常复杂 我不确定我是否了解完
  • 为什么即使我的哈希码值相同,“==”也会返回 false

    我写了一个像这样的课程 public class HashCodeImpl public int hashCode return 1 public static void main String args TODO Auto generat
  • Android中如何使用JNI获取设备ID?

    我想从 c 获取 IMEIJNI 我使用下面的代码 但是遇到了未能获取的错误cls 它总是返回NULL 我检查了环境和上下文 它们都没有问题 为什么我不能得到Context班级 我在网上搜索了一下 有人说我们应该使用java lang Ob
  • 从 MATLAB 调用 Java?

    我想要Matlab程序调用java文件 最好有一个例子 需要考虑三种情况 Java 内置库 也就是说 任何描述的here http docs oracle com javase 6 docs api 这些项目可以直接调用 例如 map ja
  • java inputstream 打印控制台内容

    sock new Socket www google com 80 out new BufferedOutputStream sock getOutputStream in new BufferedInputStream sock getI
  • 将非 Android 项目添加到 Android 项目

    我在 Eclipse 中有三个项目 Base Server 和 AndroidClient Base和Server是Java 1 7项目 而AndroidClient显然是一个android项目 基础项目具有在服务器和 Android 客户
  • Sun 在 EDT 之外做 GUI 工作的演示?

    我正在看SplashDemo java http download oracle com javase tutorial uiswing examples misc SplashDemoProject src misc SplashDemo
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • 将人类日期(当地时间 GMT)转​​换为日期

    我正在服务器上工作 服务器正在向我发送 GMT 本地日期的日期 例如Fri Jun 22 09 29 29 NPT 2018在字符串格式上 我将其转换为日期 如下所示 SimpleDateFormat simpleDateFormat ne
  • 如何在.NET中使用java.util.zip.Deflater解压缩放气流?

    之后我有一个转储java util zip Deflater 可以确认它是有效的 因为 Java 的Inflater打开它很好 并且需要在 NET中打开它 byte content ReadSample sampleName var inp
  • 张量流和线程

    下面是来自 Tensorflow 网站的简单 mnist 教程 即单层 softmax 我尝试通过多线程训练步骤对其进行扩展 from tensorflow examples tutorials mnist import input dat
  • 将 JavaFX FXML 对象分组在一起

    非常具有描述性和信息性的答案将从我这里获得价值 50 声望的赏金 我正在 JavaFX 中开发一个应用程序 对于视图 我使用 FXML
  • 使用 HtmlUnit 定位弹出窗口

    我正在构建一个登录网站并抓取一些数据的程序 登录表单是一个弹出窗口 所以我需要访问这个www betexplorer com网站 在页面的右上角有一个登录链接 写着 登录 我单击该链接 然后出现登录弹出表单 我能够找到顶部的登录链接 但找不
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • 列表过滤器内的 Java 8 lambda 列表

    示例 JSON id 1 products id 333 status Active id 222 status Inactive id 111 status Active id 2 products id 6 status Active
  • Java 11 - 将 Spring @PostConstruct 替换为 afterPropertiesSet 或使用 initMethod

    我正在使用 spring 应用程序 有时会使用 PostConstruct用于代码和测试中的设置 看来注释将被排除在外Java 11 https www baeldung com spring postconstruct predestro
  • 由 Servlet 容器提供服务的 WebSocket

    上周我研究了 WebSockets 并对如何使用 Java Servlet API 实现服务器端进行了一些思考 我没有花费太多时间 但在使用 Tomcat 进行一些测试时遇到了以下问题 如果不修补容器或至少对 HttpServletResp
  • Spring RESTful控制器方法改进建议

    我是 Spring REST 和 Hibernate 的新手 也就是说 我尝试组合一个企业级控制器方法 我计划将其用作未来开发的模式 您认为可以通过哪些方法来改进 我确信有很多 RequestMapping value user metho

随机推荐

  • 我如何实现苹果集群模式中的行为(NSString 和 NSCFString)

    我只是出于测试目的编写以下代码 NSString aStr NSString alloc initWithFormat Foo aStr aStr initWithFormat Bar Crashed here 我收到以下错误 initia
  • Flex - 如何制作选项卡面板

    我的应用程序有 3 类按钮 我想要一个选项卡式面板 可以用来在 3 类之间切换 如下所示example 我的应用程序是一个移动应用程序 所以我不能使用 mx 组件 当我尝试搜索移动选项卡式导航等时 我只提出了 viewnavigator 示
  • 使用 NHibernate 映射一对多的最小且正确的方法

    我是 NHibernate 和 C 的新手 所以请温柔一点 我有以下两个 NHibernate 实体 Employee private long id private String name private String empNumber
  • 获得 8 个源 __m256 向量的水平和的 __m256 的最有效方法[重复]

    这个问题在这里已经有答案了 我知道如何求和 m256获得单个求和值 然而 我有 8 个向量 例如 输入 1 a 0 a 1 a 2 a 3 a 4 a 5 a 6 a 7 8 h 0 h 1 h 2 h 3 h 4 a 5 a 6 a 7
  • 如何最好地确定参数是否未发送到 JavaScript 函数

    我现在看到了两种方法来确定参数是否已传递给 JavaScript 函数 我想知道一种方法是否比另一种更好 或者是否一种方法不好用 function Test argument1 argument2 if Test arguments len
  • Airflow 未回填最新运行

    由于某种原因 Airflow 似乎不会触发具有每周计划间隔的 dag 的最新运行 当前日期 date Tue Aug 9 17 09 55 UTC 2016 DAG from datetime import datetime from da
  • chown 和 chmod 后用户的文件夹权限被拒绝

    我有一个目录 home ec2 user vertica1 我正在尝试让用户dbadmin该文件夹中的所有权限 我已经对该文件夹执行了 chown 到 dbadmin 和 chmod 777 但 dbadmin 仍然收到权限被拒绝错误 如果
  • 在 iOS 中关联我的应用程序的自定义文件

    我正在尝试关联我的应用程序创建的自定义文件 它是 XML 以便用户可以通过电子邮件相互发送文件 我已经遵循了这里的优秀教程 如何将文件类型与 iPhone 应用程序关联 该文件名为 XXX checklist 但这不是关联 我相信我的问题出
  • 如何使用itext删除PDF附件

    我是 pdf 新手 我使用以下代码将文件嵌入到 pdf 中 但是 我想编写另一个程序来删除嵌入文件 我可以知道我该怎么做吗 真的感谢 public void addAttachments String src String dest Str
  • 根据反应中另一个选择框的值动态加载选择框的选项

    我正在尝试创建 2 个选择框 其中第一个选择框的选项是固定的 但第二个选择框的选项根据第一个 div 的选定值而变化 例如 第一个选择
  • 如何在 CANoe/CAPL 中包含 .h 或 .dll 文件

    我想在CAPL中集成一个头文件 h或 dll 具体是Visa32 dll visa h或sicl h 来控制万用表34461A 如何在 CANoe 中包含 h 文件或 dll 文件 我创建了一个名为万用表的 ECU 模块 谢谢 在 CAPL
  • 忽略 pexpect 响应中的 ANSI 颜色

    我可以用吗pexpect以忽略输出中的 ANSI 转义码 尤其是颜色 的方式 我正在尝试这样做 expect foo 3 bar 5 but 有时我得到带有 ANSI 颜色数字的输出 问题是我不知道哪些数字有 ANSI 颜色 哪些没有 有没
  • 带有文本和图标的微调器

    在我的应用程序中 我有一个Spinner 可以填充两个Arrays of Strings 存储在我的values strings xml资源 根据两个单选按钮的状态 选择正确数组中的值并填充我的微调器 对于每个字符串数组 我都有一个大小相同
  • iOS XMPP PubSub 在向我的订阅用户发布节点时未接收事件

    我将 XMPPClient 与 ejjaberd 用于我的聊天应用程序 如 Whatsapp 我想实现 XMPPPubsub 以在任何用户更改其个人资料图片时通知所有用户 我的框架 https github com robbiehanson
  • 如何在隐藏溢出的范围内显示点(“...”)?

    My CSS content right head span display inline block width 180px overflow hidden important 现在正在显示内容内容 但我想表现得像内容内容 我需要在内容后
  • Android:如何保存用户填写的表单的html文件

    I was able to download this form to my sdcard from a given URL 我的应用程序可以通过 Android Web 视图访问此表单 我的问题是 用户在表单中填写数据后如何将其保存到文本
  • 无法从 MAC OSX 上的后台 java 应用程序复制到剪贴板

    我们有 2 个 Java 应用程序在 MAC 上运行 一个后台应用程序将文本或图像发送到剪贴板 然后另一个应用程序抓取该数据并将其粘贴到其应用程序中 当应用程序在剪贴板上复制某些内容时 我们会遇到这个问题 后台应用程序将无法更新剪贴板 直到
  • 杰克逊+建造者模式?

    我希望杰克逊使用以下构造函数反序列化一个类 public Clinic String name Address address 反序列化第一个参数很容易 问题是 Address 定义为 public class Address privat
  • 如何查看linux的socket缓冲区大小

    Linux 的默认套接字缓冲区大小是多少 有什么命令可以看到吗 如果您想在终端中查看缓冲区大小 您可以查看 proc sys net ipv4 tcp rmem 供阅读 proc sys net ipv4 tcp wmem 用于写入 它们包
  • 为线程配置 log4j2

    有一个类叫做Test 它延伸自Thread 如何配置 log4j2 以便为每个测试线程创建我自己的日志文件 我正在尝试这样做 public class Test extends Thread private String name priv