项目上线时,需要对项目做安全检查,其中有两项是对输出日志进行分类和过滤掉日志中敏感字段。
项目使用Log4j日志系统,下面简单介绍下这两项要求的实现方式。

  1. 对日志进行分类,要求调用其他服务的API日志按照格式单独输出到一个文件。
    方式: 除根Logger外,再额外增加一个apiLogger,如下,
 <!-- api logger的设置--><logger name="log4j.logger.apiLogger" additivity="false"><level value ="INFO"/><appender-ref ref="apiConsoleAppender"/><appender-ref ref="apiMsgOutGoingAppender"/></logger><!-- 根logger的设置--><root><level value ="INFO"/><appender-ref ref="ConsoleAppender"/><appender-ref ref="DailyRollingFileAppender"/></root>

注: (1) additivity设为false,则root中的配置就失效了。即使用root配置的日志不会在apiLogger的文件中出现;
(2) 每种logger指定两个appender,分别是在debug console和Linux 服务器日志文件中显示。
根日志的ConsoleAppender和DailyRollingFileAppender的配置如下:

<appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"><!-- 设置日志输出的样式 --><layout class="org.apache.log4j.PatternLayout"><!-- 设置日志输出的格式 --><param name="ConversionPattern" value="**** [%p] [%d{yyyy/MM/dd HH:mm:ss:SSS}] ******************************%n[Thread] %t%n[Class] %C%n[Method] %M%n[Message] %m%n%n" /></layout>
</appender>
<appender name="DailyRollingFileAppender" class="org.apache.log4j.DailyRollingFileAppender"><!-- 设置日志信息输出文件全路径名 --><param name="File" value="/var/log/tomcat/hpc.log" /><!-- 设置日志多久回滚一次,即产生一个新的日志文件 --><param name="DatePattern" value="'_'yyyy-MM-dd" /><!--日志编码格式--><param name="Encoding" value="UTF-8" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 --><param name="Append" value="true" /><!-- 设置日志输出的样式 --><layout class="org.apache.log4j.PatternLayout"><!-- 设置日志输出的格式 --><param name="ConversionPattern" value="**** [%p] [%d{yyyy/MM/dd HH:mm:ss:SSS}] *************************%n[Thread] %t%n[Class] %C%n[Method] %M%n[Message] %m%n%n" /></layout><!-- 日志过滤: adminPass, X-Auth-Token; 包含该字符串的信息不输出 --><filter class="org.apache.log4j.varia.StringMatchFilter"><param name="StringToMatch" value="adminPass" /><param name="AcceptOnMatch" value="false" /></filter><filter class="org.apache.log4j.varia.StringMatchFilter"><param name="StringToMatch" value="X-Auth-Token" /><param name="AcceptOnMatch" value="false" /></filter><filter class="org.apache.log4j.varia.StringMatchFilter"><param name="StringToMatch" value="PW" /><param name="AcceptOnMatch" value="false" /></filter><filter class="org.apache.log4j.varia.StringMatchFilter"><param name="StringToMatch" value="pwd" /><param name="AcceptOnMatch" value="false" /></filter><!-- password Password--><filter class="org.apache.log4j.varia.StringMatchFilter"><param name="StringToMatch" value="assword" /><param name="AcceptOnMatch" value="false" /></filter><!-- 过滤pstmt-, 所有的数据库操作均包含此字符串--><filter class="org.apache.log4j.varia.StringMatchFilter"><param name="StringToMatch" value="pstmt-" /><param name="AcceptOnMatch" value="false" /></filter></appender>

apiLogger的apiConsoleAppender和apiMsgOutGoingAppender设置如下:

<!-- 将日志信息输出到文件,可以配置多久产生一个新的日志信息文件 -->
<appender name="apiConsoleAppender" class="org.apache.log4j.ConsoleAppender"><!-- 设置日志输出的样式 --><layout class="org.apache.log4j.PatternLayout"><!-- 设置日志输出的格式 --><param name="ConversionPattern" value='[%-5p] [Outgoing] %X{og.serverIp} [%d{yyyy-MM-dd HH:mm:ss,SSS z}] %X{og.respTime} "%X{og.visitUri}" %X{og.statusCode} %X{og.reqLen} %X{og.respLen} %n' /></layout>
</appender>
<appender name="apiMsgOutGoingAppender" class="org.apache.log4j.RollingFileAppender"><!-- 设置日志信息输出文件全路径名 --><param name="File" value="/var/log/tomcat/interface.log" /><!--日志编码格式--><param name="Encoding" value="UTF-8" /><!-- 设置是否在重新启动服务时,在原有日志的基础添加新日志 --><param name="Append" value="true" /><!-- 设置文件最大size --><param name="MaxFileSize" value="30MB" /><!-- 保留日志文件数的最大值 --><param name="MaxBackupIndex" value="100" /><!-- 设置日志输出的样式 --><layout class="org.apache.log4j.PatternLayout"><!-- 设置日志输出的格式 --><param name="ConversionPattern" value='[%-5p] [Outgoing] %X{og.serverIp} [%d{yyyy-MM-dd HH:mm:ss,SSS z}] %X{og.respTime} "%X{og.visitUri}" %X{og.statusCode} %X{og.reqLen} %X{og.respLen} %n'/></layout>
</appender>

注:(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.serverIp", 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:

        <!-- 过滤password Password--><filter class="org.apache.log4j.varia.StringMatchFilter"><param name="StringToMatch" value="assword" /><param name="AcceptOnMatch" value="false" /></filter>

StringMatchFilter中使用msg.indexOf(StringToMatch)参数判断是否过滤,即该条日志包含指定字段,若AcceptOnMatch设置为false,则不输出。
需要注意的是,log4j日志系统采用xml格式时才能用该种方式过滤,properties格式时不能用此方法。

Log4j日志分类和过滤敏感字段相关推荐

  1. 后端如何过滤敏感字段传参给前端

    一.背景 之所以写这篇文章是因为最近一次和前端调试一个接口的时候,返给前端的字段有些是比较隐私的,涉及到用户的基本信息以及账户相关信息,因此是比较重要的,如果将这些信息显示在前端的话非常危险,因此我们 ...

  2. Log4j.xml配置日志按级别过滤并将指定级别的日志发送到ActiveMQ

    为什么80%的码农都做不了架构师?>>>    在之前的一篇博客<Spring+Log4j+ActiveMQ实现远程记录日志--实战+分析>的评论中,有同学提到这种方式应 ...

  3. linux activemq 打印日志,Log4j.xml配置日志按级别过滤并将指定级别的日志发送到ActiveMQ...

    目标:将debug,info级别的日志输出到本地文件,将warn,error级别的日志输出到ActiveMQ. 说明:本文还是使用之前的两个项目:Product和Logging. 经过一番搜索后,发现 ...

  4. Android日志分类及查看过滤

    Android日志分类及查看过滤 参考链接:https://www.jianshu.com/p/1c9106dd8284?utm_campaign=maleskine&utm_content= ...

  5. ELKB日志流:日志分类思路

    目录 0.引言 1.分类思路 2.日志类型分类 2.1 系统日志 2.2 业务日志 3.日志内容分类 4.日志字段规划 4.1 业务日志:行为日志 4.2 业务日志:错误日志 0.引言 日志已经可以收 ...

  6. flume可以实时监控mysql嘛_flume使用(三):实时log4j日志通过flume输出到MySql数据库...

    本文在[flume使用(二):采集远程日志数据到MySql数据库]一文基础之上进行测试操作.本文使用到的: flume版本.jdk版本.mysql.数据库表.javaBean.自定义的mysqlSin ...

  7. Oracle日志分类

    一.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和            redo log 重做日志(记录数据库的更改 ...

  8. 用姓名字段统计人数_基于 Wide amp; Deep 网络和 TextCNN 的敏感字段识别

    数据治理 (Data Governance) [1]作为一种数据管理的重要一环,主要目的在于保证数据在整个生命周期内的高质量性.数据治理的核心包括:数据的可用性 (Availability),易用性 ...

  9. 日志搜集、过滤及推送处理框架logstash及fluentd总结

    简介 Logstash是一个接收,处理,转发日志的工具.支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型.怎么样听起来挺厉害的吧? 在一个典型的使用场景下(E ...

最新文章

  1. XtraGrid GridView设置默认选中的行颜色
  2. 泛函编程(19)-泛函库设计-Parallelism In Action
  3. Transaction And Lock--锁相关基础
  4. 检测你的机子上装了什么版本的.net framework
  5. Linux_相关命令(学习,备忘)
  6. MyBatis使用resultMap自定义映射规则与关联映射
  7. Robert C. Martin关于UML、CASE的观点
  8. register关键字-1
  9. eclipse linux 代码提示,Linux Eclipse代码提示功能设置(Java C/C++)
  10. JSP自定义标签(2)
  11. 机器人学导论 一、空间变换(1)位姿,变换
  12. 高级电工、模电、数电、电力拖动实验室成套设备
  13. Java中new一个对象是一个怎样的过程?JVM中发生了什么?
  14. 计算机网络基础之广域网
  15. 更多数学趣题:走迷宫
  16. filco的pin码_filco蓝牙键盘配对流程,filco 忍者二代 蓝牙怎么
  17. C语言人五英尺七英寸,“5英尺7英寸”等于多少厘米
  18. PHP上传Excel文件
  19. Tapestry的使用
  20. 在keil中使用bdata型可位寻址全局变量

热门文章

  1. 为什么内存和存储都涨价了
  2. arduino蜂鸣器音乐代码_STM32驱动蜂鸣器演奏音乐“你笑起来真好看”
  3. 西门子MES软件ebr脚本使用说明-SIMATIC IT EBR(Opcenter Execution Pharma
  4. 2022年的物联网发展趋势是什么?
  5. 章节七:RASA NLU组件介绍--意图分类器和实体提取器
  6. 判断数组是否为空的条件
  7. 【蓝桥杯】入门考试十道练习题
  8. 股票基础知识 - 通过股票前缀代码判断股票是什么类型,属于哪个板块
  9. Elasticsearch插件(三):stconvert
  10. 【行研报告】2021年中国电竞行业研究报告—附下载链接