我有一个小型 Spring 应用程序,它使用一些外部库。这些, 两个特别用途:
library1.jar
使用SLF4J。library2.jar
使用java.util.logging。我的应用程序当前使用 Log4J2,但如果需要,我可以更改它。
现在,运行应用程序时,日志文件会显示不同格式的不同日志行,具体取决于它是使用 java.util.logging 还是 Log4J2。
我读到 SLF4J 和/或 Apache Commons Logging 可以以某种方式将所有日志记录“合并”为单一格式。这真的可能吗?
是的,这是可能的。您可以定义一个 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 文件中使用了正确的日志记录依赖项。