我已经创建了一个maven java项目,如果给定一个folderpath,代码将遍历文件夹并逐个选择文件,并读取文件的所有内容(文件类型支持-txt,pdf,word,excel,csv,xml,日志)如何使用log4j 2或任何其他库为每个文件创建与“filename_filetype.log”同名的单独日志文件也将工作。
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模式
1条答案
按热度按时间sr4lhrrt1#
这是我最近使用的一个例子,我使用的log4j2.xml如下所示:
我使用了两个RoutingAppenders,但它们基本上是相同的,我只是想为相同的标记记录不同的内容。它会获取标记值并将其插入占位符为${marker:}的位置。在我的代码中,我示例化了标记,如下所示:
你可以将文件名和文件类型作为参数传递给getMarker(),然后,当你记录日志时,你可以将标记符和你想记录的任何语句传递给日志记录器,如下所示:
我知道我提供的答案非常简短,而且切中要害,没有太多的解释,但这里有一个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模式