如何正确配置log4j和logback,使它们记录到同一个文件中?

4
我有一个使用logback和slf4j记录日志的Java Web应用程序。 该项目具有一个依赖项jar(即子项目)。该依赖项jar使用org.apache.log4j.Logger记录日志。 所有日志都必须写入一个日志文件中。 我的问题是,无论我在jar文件中使用什么代码进行记录,都没有被写入日志文件中。 最初我有logback.xml。为了解决上述问题,我在web应用程序中添加了log4j.properties文件。 这解决了我的问题,现在我可以在一个文件中看到所有日志。
再次出现了新的问题:以前,根据logback.xml中的滚动策略,日志文件每天滚动一次。 现在不再滚动了。即使我在log4j.properties中配置了与logback.xml中相匹配的滚动策略,也不会滚动。
我不想用logback替换我的依赖项中的log4j。同时,我也想将所有日志写入一个文件中。 这个可能吗?我该如何解决我的问题?
FYI:我的pom.xml中包含“log4j-over-slf4j”依赖项
Log4j.properties:
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.File=SOME_PATH/logs/studentApp.log
log4j.appender.file.rollingPolicy = org.apache.log4j.rolling.TimeBasedRollingPolicy
log4j.appender.file.rollingPolicy.FileNamePattern = SOME_PATH/logs/studentApp.%d{yyyy-MM-dd}.log    
log4j.appender.file.maxBackupIndex=14
log4j.appender.file.threshold=DEBUG
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=[%-5p] %d %c - %m%n
log4j.rootLogger=DEBUG,file
2个回答

1
以下配置将创建一个以当前日期命名的.log文件,并将日志添加到该文件中。当日期更改时,它将创建一个带有当前日期的新文件。此配置还会在文件超过一定大小限制时对文件进行压缩。
    <appender name="FILE"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>log.%d{yyyy-MM-dd}.%i.log.zip</fileNamePattern>

                          <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                                <!-- or whenever the file size reaches 500MB -->
                                <maxFileSize>300MB</maxFileSize>
                        </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder>
            <pattern>%date %level [%thread] %logger{0} - %msg%n</pattern>
        </encoder>
    </appender>

希望它有所帮助。

1
假设您的滚动策略是正确的,那么log4j可能会选择错误的配置。log4j在类路径中查找第一个配置文件(首先是.xml,然后是.properties),如果它恰好是您依赖项之一的配置,则滚动策略将无法工作。
要测试这一点,您可以在tomcat启动脚本中添加系统属性“-Dlog4j.configuration = ...”,并附上配置文件的路径。或者只需将日志级别设置为TRACE / DEBUG,并查看其是否影响输出。
编辑:您的log4j配置看起来不错,但缺少日期模式。 尝试添加 log4j.appender.file.DatePattern = '.'yyyy-MM-dd-HH-mm(请注意,我已将模式设置为每分钟翻转,以便于测试)
编辑:您可以删除包含rollingPolicy和maxBackupIndex的每行 - 在这种情况下,这些将不会被选中

谢谢你的回答,但是我的依赖中没有log4j的配置。 - The Guest
你尝试过更改调试级别以确保正确选择配置吗?也许你的滚动策略有些问题。 - nyname00
我已经编辑了我的问题,展示了我的属性文件。请查看并让我知道其中是否有任何错误,谢谢。 - The Guest
我尝试将调试级别设置为DEBUG,并注意到它正确地获取了配置。 - The Guest
我按照你的编辑所说的做了,现在它正在运行,但文件名是错误的。例如,它显示的是studentApp.log.2016-03-17-10-53而不是studentApp.2016-03-17-10-53.log,因此我无法打开该文件,你有什么想法吗? - The Guest
请查看我的问题:http://stackoverflow.com/questions/36066040/configure-rolling-log4j-log-file-name - The Guest

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