log4j 如何在文件路径中迭代并阅读文件内容时动态记录如何为每个文件创建单独的日志文件?

bf1o4zei  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(188)

我已经创建了一个maven java项目,如果给定一个folderpath,代码将遍历文件夹并逐个选择文件,并读取文件的所有内容(文件类型支持-txt,pdf,word,excel,csv,xml,日志)如何使用log4j 2或任何其他库为每个文件创建与“filename_filetype.log”同名的单独日志文件也将工作。

sr4lhrrt

sr4lhrrt1#

这是我最近使用的一个例子,我使用的log4j2.xml如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <Properties>
        <Property name="CONSOLE_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
        <Property name="LOG_PATTERN">%d %-5p method: [%t] %C{2} (%F:%L) - %m%n</Property>
    </Properties>

    <Appenders>
        <Routing name="RoutingAppender">
            <Routes pattern="$${marker:}">
                <Route>
                    <RollingFile name="RollingFile-${marker:}"
                                 fileName="./logs/application/${marker:}/app.log"
                                 filePattern="./logs/application/${marker:}/app-%d{MM-dd-yyyy}.log.gz"
                                 ignoreExceptions="false">
                        <PatternLayout pattern="${LOG_PATTERN}"/>
                        <TimeBasedTriggeringPolicy/>
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>

        <Console name="StdOut" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${CONSOLE_PATTERN}"/>
        </Console>

        <Routing name="SequenceRoutingAppender">
            <Routes pattern="$${marker:}">
                <Route>
                    <RollingFile name="Sequencing-${marker:}"
                                 fileName="./logs/service/${marker:}/seq_gap.log"
                                 filePattern="./logs/service/${marker:}/seq_gap-%d{MM-dd-yyyy}.log.gz"
                                 ignoreExceptions="false">
                        <PatternLayout pattern="${LOG_PATTERN}"/>
                        <TimeBasedTriggeringPolicy/>
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="RoutingAppender"/>
        </Root>
        <logger name="SequencingLogger" additivity="false" level="info">
            <AppenderRef ref="SequenceRoutingAppender"/>
        </logger>
    </Loggers>
</Configuration>

我使用了两个RoutingAppenders,但它们基本上是相同的,我只是想为相同的标记记录不同的内容。它会获取标记值并将其插入占位符为${marker:}的位置。在我的代码中,我示例化了标记,如下所示:

Marker mainMarker = MarkerManager.getMarker("MAIN");
    Marker applicationMarker = MarkerManager.getMarker("APPLICATION");
    Marker sequenceMarker = MarkerManager.getMarker("SEQUENCE");

你可以将文件名和文件类型作为参数传递给getMarker(),然后,当你记录日志时,你可以将标记符和你想记录的任何语句传递给日志记录器,如下所示:

LOGGER.warn(mainMarker, "unable to find config in working directory. Fall back to jar config");

我知道我提供的答案非常简短,而且切中要害,没有太多的解释,但这里有一个informative site,解释了正在发生的事情,以及为什么有些事情是这样做的。我经常使用它,试图理解RoutingAppender是如何工作的,因为Apache提供的示例和SO上的其他示例都非常简短。
并引用链接
工艺路线保存在Appender下,它是一个RoutingAppender。
路由元素接受名为“pattern”的单个属性。将根据所有已注册的代码评估该模式,并使用结果选择路由。每个路由都可以配置一个关键字。如果关键字与评估模式的结果匹配,则将选择该路由。如果未在路由上指定关键字,则该路由为默认值。只能将一个路由配置为默认值。
Routes元素可以包含Script子元素。如果指定,则为每个日志事件运行脚本,并返回要使用的String Route键。
必须指定pattern属性或Script元素,但不能同时指定两者。
每个路由都必须引用一个Appender。如果路由包含ref属性,则路由将引用配置中定义的Appender。如果路由包含Appender定义,则将在RoutingAppender的上下文中创建一个Appender,并在每次通过路由引用匹配的Appender名称时重用该Appender。
在我们的示例中,Routes模式是$${ctx:module},该模式与上下文中名为module的键匹配。
但在我的示例中,$${marker:}中的Routes模式

相关问题