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

问题描述 投票:0回答:1

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

java logging log4j log4j2 slf4j
1个回答
1
投票

这是我最近使用的一个例子。我使用的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>

我使用了两个 RoutingAppender,但两者基本相同,我只是想为相同的标记记录不同的内容。它会获取标记值并将其插入到占位符为 ${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");

我知道我提供的答案非常简短,而且没有太多解释原因,但这里有一个 信息网站,它解释了正在发生的事情,以及为什么有些事情会按照它们的方式完成。由于 Apache 提供的示例非常简短,我在尝试了解 RoutingAppender 的工作原理时经常使用它。

并从链接中引用

Routing 保存在 Appender 下,它是一个 RoutingAppender。

Routes 元素接受一个名为“pattern”的属性。这 pattern 是根据所有注册的查找和结果进行评估的 用于选择路线。每个 Route 都可以配置一个 key。如果 键与评估模式的结果相匹配,然后是 Route 将被选中。如果在 Route 上没有指定键,则该 Route 是 默认值。只能将一个路由配置为默认路由。

Routes 元素可能包含一个 Script 子元素。如果指定, 为每个日志事件运行脚本并返回字符串路由键 使用。

您必须指定模式属性或脚本元素, 但不是两者都是。

每个 Route 必须引用一个 Appender。如果 Route 包含一个 ref 属性然后 Route 将引用已定义的 Appender 在配置中。如果 Route 包含 Appender 定义 然后将在 RoutingAppender 和每次匹配的 Appender 名称都会被重用 通过路由引用。

在我们的示例中,路由模式是 $${ctx:module}。这个图案 与上下文中名为 module 的键匹配。

但在我的例子中 $${marker:} 中的 Routes 模式

© www.soinside.com 2019 - 2024. All rights reserved.