是否可以整合Java日志记录?

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

我有一个小型 Spring 应用程序,它使用一些外部库。这些, 两个特别用途:

  • library1.jar
    使用SLF4J。
  • library2.jar
    使用java.util.logging。

我的应用程序当前使用 Log4J2,但如果需要,我可以更改它。

现在,运行应用程序时,日志文件会显示不同格式的不同日志行,具体取决于它是使用 java.util.logging 还是 Log4J2。

我读到 SLF4J 和/或 Apache Commons Logging 可以以某种方式将所有日志记录“合并”为单一格式。这真的可能吗?

java spring logging
1个回答
0
投票

是的,这是可能的。您可以定义一个 GlobalRequestLoggingAdvice 类并在那里定义您自己的策略。

 Before("execution(* com.example.controller.*.*.*(..))")
    public void beforeWebMethodExecution(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
        String methodName = joinPoint.getSignature().getName();
        String className = joinPoint.getSignature().getDeclaringType().getName();
        if (checkLogAcceptance(args, className, methodName)) {

            //define your log generation logic here with required parameters
            //Define a custom pojo class with necessary paramets and build the desired log pattern here
        }
    }

在 src/main/resource 目录中创建 log4j2.xml 并在那里定义常用模式

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss aaa} %5p [%c] - %m%n</Property>
    </Properties>
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </Console>

        <RollingRandomAccessFile name="RollingFileAppender" fileName="${user.home}/log/hcs.log"
                                 filePattern="${user.home}/log/hcs.log.%d{yyyy-MM-dd}">
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="1"/>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Root level="ERROR">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Root>
        <Logger name="your application package anme here (com.example.app)" level="DEBUG" additivity="FALSE">
            <AppenderRef ref="ConsoleAppender"/>
            <AppenderRef ref="RollingFileAppender"/>
        </Logger>
    </Loggers>
</Configuration>

最后用 SLF4J 替换对 java.util.logging 或任何其他日志框架的任何直接调用。例如:

public class MyController{

private static final Logger logger = LoggerFactory.getLogger(MyController.class);

    public void testLog() {
        logger.info("This is a test log message");
    }

}

请确保您在 pom.xml 文件中使用了正确的日志记录依赖项。

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