如何使用Apache log4j2功能和log4j2配置文件将内容写入CSV文件?

3

我一直在努力使用Log4j中的CsvParameterLayout生成CSV文件。我已经按照以下方式编写了log4j2配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
<Property name="csvLog.fileName">C:/ql/logs/csvLog</Property>
</Properties>
<Appenders>
<RollingFile name="csvFile" fileName="${csvLog.fileName}.tmp"
    filePattern="${csvLog.filename}-%d{MM-dd-yyyy}-%i.csv" header="${file-header}">
        <CsvParameterLayout delimeter=","/>
        <Policies>
                <TimeBasedTriggeringPolicy interval="1"
                    modulate="true" />
                <SizeBasedTriggeringPolicy size="10 MB" />
        </Policies>
        <DefaultRolloverStrategy max="200" />
    </RollingFile>
</Appenders>
<Loggers>
<Root level="debug" additivity="false">
        <AppenderRef ref="csvFile" level="debug"/>
    </Root>
</Loggers>
</Configuration>

然而,我无法生成所需的CSV文件。请问是否有人能帮助我?同时,在未来,我想在我打印的所有内容之前添加一个唯一的ID,这个ID将由线程上下文生成。

请帮忙。


请解释哪一部分没有起作用。文件未创建,内容是否完全错误,其中是否缺少某些内容... - GhostCat
分隔符的拼写错误了,但是更正它并没有解决问题。 - Siddharth Mehta
文件未被创建。 - Siddharth Mehta
好的,你以前用过log4j创建过日志文件吗? - GhostCat
实际上,我们的应用程序确实会创建日志文件...虽然我自己没有参与过这个项目..但是我被分配为 POC..所以简而言之,我的应用程序确实会创建日志文件(我只附加了一小段代码以保密),但我没有参与此模块的开发。 - Siddharth Mehta
显示剩余2条评论
3个回答

4

根据Log4j 2文档中CSV Layout的说明,它依赖于Apache Commons CSV

以下是可工作的代码片段。

pom.xml

...
<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.6.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.6.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-csv</artifactId>
        <version>1.4</version>
    </dependency>
</dependencies>
...

log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="csvLog.fileName">csvLog</Property>
        <Property name="file-header">column1,column2,column3</Property>
    </Properties>
    <Appenders>
        <RollingFile name="csvFile" 
                     fileName="${csvLog.fileName}.tmp"
                     filePattern="${csvLog.filename}-%d{MM-dd-yyyy}-%i.csv" >
            <CsvParameterLayout delimiter="," header="${file-header}\n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                <SizeBasedTriggeringPolicy size="10 MB" />
            </Policies>
            <DefaultRolloverStrategy max="200" />
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="debug" additivity="false">
            <AppenderRef ref="csvFile" level="debug"/>
        </Root>
    </Loggers>
</Configuration>

Java代码片段

Logger logger = LogManager.getLogger(...);
logger.info("sample output", "foo", "bar");

输出csvLog.tmp

column1,column2,column3
foo,bar

edit

log4j2.properties

appenders = csvFile

appender.csvFile.type = RollingFile
appender.csvFile.name = CSVFILE
appender.csvFile.fileName = csvLog.tmp
appender.csvFile.filePattern= csvLog-%d{MM-dd-yyyy}-%i.csv
appender.csvFile.layout.type = CsvParameterLayout
appender.csvFile.layout.delimiter = ,
appender.csvFile.layout.header = column1,column2,column3\n
appender.csvFile.policies.type = Policies
appender.csvFile.policies.time.type = TimeBasedTriggeringPolicy
appender.csvFile.policies.time.interval = 1
appender.csvFile.policies.time.modulate = true
appender.csvFile.policies.size.type = SizeBasedTriggeringPolicy
appender.csvFile.policies.size.size=10MB
appender.csvFile.strategy.type = DefaultRolloverStrategy
appender.csvFile.strategy.max = 200

rootLogger.level = debug
rootLogger.appenderRefs = csvFile
rootLogger.appenderRef.csvFile.ref = CSVFILE

这似乎正是我在寻找的。我必须下载commons CSV jar。非常感谢Sub Optimal!明天测试后我会将此答案标记为正确。 - Siddharth Mehta
顺便问一下,似乎日志的第一个条目“示例输出”没有被记录到文件中。有什么原因吗? - Siddharth Mehta
1
如果您查看我发布的链接 CSV布局,您会看到它提到了CsvParameterLayout将事件参数转换为CSV记录,忽略消息。(消息被忽略,或者您可以使用 ObjectArrayMessage 记录日志)。@SiddharthMehta - SubOptimal
你可以用属性风格编写配置吗? - Sultan Zhumatayev
我有以下配置:codelog4j.appender.activity=org.apache.log4j.DailyRollingFileAppender log4j.appender.activity.file=../logs/activity.log log4j.appender.activity.append=true log4j.appender.activity.datePattern='.'yyyy-MM-dd'.log' log4j.appender.activity.layout=org.apache.log4j.SimpleLayout log4j.appender.activity.threshold=infocode 当我想要 csvlayout 时,应该设置什么布局? - Sultan Zhumatayev
@SultanZhumatayev 我添加了一个 log4j2.properties 的例子(适用于 Log4j 2)。CSV 布局在 Log4j 1.x 中不存在。 - SubOptimal

1

0

针对groupID的版本应该是"org.apache.logging.log4j" 2.7,否则在将日志写入CSV时会包含一些额外的字符。

<dependencies>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.7</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-csv</artifactId>
        <version>1.6</version>
    </dependency>
</dependencies>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接