Log4j日志分类和过滤敏感字段的实例

网友投稿 240 2023-02-15

Log4j日志分类和过滤敏感字段的实例

项目上线时,需要对项目做安全检查,其中有两项是对输出日志进行分类和过滤掉日志中敏感字段。

项目使用Log4j日志系统,下面简单介绍下这两项要求的实现方式。

对日志进行分类,要求调用其他服务的API日志按照格式单独输出到一个文件。

方式: 除根Logger外,再额外增加一个apiLogger,如下,

注: (1) additivity设为false,则root中的配置就失效了。即使用root配置的日志不会在apiLogger的文件中出现;

(2) 每种logger指定两个appender,分别是在debug console和linux 服务器日志文件中显示。

根日志的ConsoleAppender和DailyRollingFileAppender的配置如下:

apiLogger的apiConsoleAppender和apiMsgOutGoingAppender设置如下:

注:(1) Log4j系统Appender组件负责日志的输出配置,包括输出目录,最大输出大小,输出文件数等;Layout组件负责日志输出的格式。

(2)java代码在使用日志系统时,默认用根日志的配置输出,若想使用apiLogger,使用:

private static Logger log = Logger.getLogger("log4j.logger.apiLogger");

(3)日志layout中传入自定义参数,使用MDC类:

public static void configAndPrintAPILogger(Logger logger, int statusCode, String method, String url,

long responseTime,

int requestLength, int responseLength)

{

String endpoint = url.split("/")[2];

MDC.put("og.serverIphttp://", endpoint);

MDC.put("og.respTime", responseTime);

//截取 https://endpoint之后的

MDC.put("og.visitUri", method + " " + url.substring(8 + endpoint.length()));

MDC.put("og.statusCode", statusCode);

MDC.put("og.reqLen", requestLength);

MDC.put("og.respLen", responseLength);

logger.info("");

}

经上述配置后,日志的输出如下:

2. 日志中过滤敏感字符,如password, PW, adminPass等。如DailyRollingFileAppender中所示,使用StringMatchFilter:

StringMatchFilter中使用msg.indexOf(StringToMatch)参数判断是否过滤,即该条日志包含指定字段,若AcceptOnMatch设置为false,则不输出。

需要注意的是,log4j日志系统采用xml格式时才能用该种方式过滤,properties格式时不能用此方法。

补充知识:解决日志log4j,slf4j,logback冲突问题

问题描述:

启动tomcat,发现tomcat无法启动,catalina.out有如下错误日志:

INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log Closing Spring root WebApplicationContext

SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStop Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener

java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory

at org.apache.log4j.LogManager.getLogger(LogManager.java:44)

at org.slf4j.impl.Log4jLoggerFactory.getLogger(Log4jLoggerFactory.java:73)

at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:270)

at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:156)

at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:132)

at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:274)

at org.springframework.web.context.ContextCleanupListener.(ContextCleanupListener.java:43)

at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:145)

at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4860)

at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5495)

at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:224)

at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:159)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1407)

at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1397)

at java.util.concurrent.FutureTask.run(FutkiJlSIureTask.java:266)

at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

at java.lang.Thread.run(Thread.java:745)

问题分析:

检查lib库下面,发现今天更新过log4j和logback组合,总共有如下包:

slf4j-api-1.7.5.jar

slf4j-log4j12-1.6.1.jar

log4j-1.2.16.jar

log4j-over-slf4j-1.7.5.jar

logback-core-1.1.2.jar

logback-classic-1.1.2.jar

通过查询资料发现,包slf4j-log4j12-1.6.1.jar 和log4j有冲突。

解决方法:

删除后正常,删除这个:slf4j-log4j12-1.6.1.jar

附件常见组合:

log4j+slf4j

slf4j-api-1.7.5.jar

slf4j-log4j12-1.6.1.jar

log4j-1.2.16.jar

slf4j+logback

logback-core-1.1.2.jar

logback-classic-1.1.2.jar

slf4j-api-1.7.5.jar

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:自开发数据可视化平台(数据可视化平台 开源)
下一篇:Ibatis配置xml文件CDATA使用方法详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~