Day920.结构化日志&业务审计日志 -SpringBoot与K8s云原生微服务实践

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day920.结构化日志&业务审计日志 -SpringBoot与K8s云原生微服务实践相关的知识,希望对你有一定的参考价值。

结构化日志&业务审计日志

Hi,我是阿昌,今天学习记录的是关于结构化日志&业务审计日志的内容。

1、什么是结构化日志

结构化日志(Structured Logging)是一种将日志信息组织为结构化数据的技术。

传统的日志通常是一些文本信息,比如一行记录一个错误或者事件,这些信息往往是自由格式的。

相比之下,结构化日志则采用一定的数据格式和模式,将日志信息组织为结构化的数据。

结构化日志可以提供更多的信息,比如时间戳、请求 ID、日志级别、错误类型等等,并且还可以包含一些自定义字段。

这些信息可以用于更好地理解应用程序的行为,从而更快地定位问题并进行故障排除。

另外,结构化日志还可以方便地与其他工具集成,比如日志聚合工具、监控系统、日志分析工具等等,以便于更好地管理和分析日志数据。

总之,结构化日志是一种更加规范和高效的日志记录方式,它可以提供更多的信息和更好的可读性,同时还能够更好地支持各种日志管理和分析工具的集成。


2、什么是业务审计日志

业务审计日志(Business Audit Log)是一种记录系统中关键业务事件的日志,这些事件通常与应用程序的业务逻辑有关。

业务审计日志可以记录诸如用户登录、数据修改、交易流程、审批流程等重要事件,以便管理人员对系统进行审计。

此外,业务审计日志还可以跟踪应用程序中的所有操作,并记录有关这些操作的详细信息,如时间戳、请求 ID、执行结果、错误类型等等。

通过使用业务审计日志,管理人员可以快速定位和排查系统中的问题,以便及时采取措施。

此外,业务审计日志还可以帮助企业遵守法规和标准,如HIPAA、PCI DSS等等。

这是因为这些法规和标准通常要求企业记录和保留关键业务事件的详细信息,以便进行监管和审核。

总之,业务审计日志是软件开发领域中一种重要的日志记录方式,它可以提供关键的业务信息,帮助管理人员了解应用程序的运行状况,并支持企业遵守法规和标准。


3、Log4j2

Log4j2 提供了一些内置的格式化器和日志适配器,可以轻松地将日志发送到各种目标,如文件、控制台、远程服务器和数据库。

它还提供了灵活的配置选项,使开发人员能够根据不同的需求对日志记录进行定制。除了传统的日志级别和文本消息之外,Log4j 2 还支持使用消息对象来记录结构化日志。

这些消息对象可以包含多个键值对,表示一些事件、错误或其他信息。这种方式可以更清晰地记录日志事件,并支持更好的可读性和可搜索性。

总之,Log4j 2 是 Java 领域中一种常见的结构化日志库,它提供了方便的方式来记录结构化日志,并支持灵活的配置选项和多种目标输出。


4、Structlog4j

Structlog4j用了Log4j2规范的一种结构化日志框架


Maven

<!--基础包-->
<dependency>
    <groupId>tech.ibit</groupId>
    <artifactId>structlog4j-api</artifactId>
    <version>1.2</version>
</dependency>

<!--扩展包-->
<dependency>
    <groupId>tech.ibit</groupId>
    <artifactId>structlog4j-extend</artifactId>
    <version>1.2</version>
</dependency>

structlog4j的核心思想就是将日志已key-value的方式呈现,方便日期切分。

引入logger

import tech.ibit.structlog4j.Logger;
import tech.ibit.structlog4j.StructLoggerFactory;
private static final Logger log = StructLoggerFactory.getLogger(Test.class);

默认日志格式(key-value):

_message=Something error!&user=ibit-tech_errorMessage=Test Exception

json日志格式

"_message":"Something error!","user":"ibit-tech","_errorMessage":"Test Exception"

修改全局formatter方法:

方法1(java代码):
StructLog4J.setFormatter(JsonFormatter.getInstance());
方法2(classpath:/structlog4j.properties):
formatter=tech.ibit.structlog4j.extend.JsonFormatter#getInstance

用法

_message说明(以error为例子)

Logger存在一下方法支持error级别日志

/**
 * ERROR日志
 *
 * @param message 消息
 * @param params  参数
 */
void error(String message, Object... params);


/**
 * ERROR日志
 *
 * @param messages 消息片段
 * @param params   参数
 */
void error(Object[] messages, Object... params);

其中message和messages的区别在于,messages支持传入占位符,eg:

logger.error("Something error, id: 12, username: ibit-tech");

等价于:

logger.error(new Object[] "Something error, id: , username: ", 12, "ibit-tech");

使用key-value的方式

log.error("Something error", "user", "ibit-tech", "age", 100);

实现ToLog对key-value进行包装

log.error("Something error", (ToLog) () -> new Object[] "user", "ibit-tech", "age", 1.2);

异常处理

log.error("Something error", "user", "ibit-tech", "age", 100, new RuntimeException("Test Exception"));

混合使用

log.error("Something error", (ToLog) () -> new Object[] "user", "ibit-tech", "age", 1.2);
log.error("Something error", (ToLog) () -> new Object[] "user", "ibit-tech", "age", 1.2, (ToLog) () -> new Object[] "city", "sz", new RuntimeException("Test Exception"));

POJO实现MapToLog,toLog()会返回POJO中所有字段

@Test
public void toLog() 
    User user = new User("ibit-tech", 21);
    Assert.assertEquals("[name, ibit-tech, age, 21]", Arrays.asList(user.toLog()).toString());

	
@Value
public class User implements MapToLog 
    private String name;
    private int age;


binlog+审计日志 定位mariadb(mysql)数据库特定sql

  最近线上数据莫名的丢数据,故进行sql定位,定位线上数据为何丢失,最后定位到具体某开发程序。

  审计日志:记录数据库所有信息,故会有巨大的日志,而且参数设置审计日志大小,会进行审计日志轮换分割。

1.基于审计日志这个特点,业务提出问题后,要及时发现问题解决问题。

线上业务日志为512M一个日志,共10个。大约能记录8个小时左右的数据库访问信息。

2.binlog:binlog是记录mysql数据库变化的信息,记录增删改等信息。

结合以上两点:可以binlog定位问题sql,通过审计日志定位操作DB的IP,用户从而定位到具体某人。

(如果每个开发有单独的数据库操作用户/权限,定位会更加准确)

比如业务给一个字段 id=11223344 记录被删除。

日志量小的时候,可通过审计日志直接定位。日质量大的时候可能比较困难定位。

实验:

MariaDB [test]> create table t111 ( id int not null, name varchar(30), city varchar(30));

Query OK, 0 rows affected (0.08 sec)

MariaDB [test]> insert into t111 (id,name) values (1,'aaa'),(2,'bbb'),(3,'ccc'),(11223344,'dddd');

Query OK, 4 rows affected (0.02 sec)

Records: 4  Duplicates: 0  Warnings: 0

MariaDB [test]> delete from t111 where id=11223344;

Query OK, 1 row affected (0.04 sec)


  1. 通过binlog分析:

  • 确定当前binlog

    show master status;


    +------------------+

    | File             |

    +------------------+

    | mysql-bin.000023 |

    +------------------+

/usr/local/mysql/bin/mysqlbinlog --start-datetime='2018-02-26 15:00:00' --stop-datetime='2018-02-26 15:13:00' -v --base64-output=decode-rows mysql-bin.000023 >/data/bin.log


#180226 15:09:48 server id 3306116  end_log_pos 775 CRC32 0x27b288a6    GTID 0-3306116-1280 trans

/*!100001 SET @@session.gtid_seq_no=1280*//*!*/;

BEGIN

/*!*/;

# at 775

#180226 15:09:48 server id 3306116  end_log_pos 828 CRC32 0x636faceb    Table_map: `test`.`t111` mapped to number 609

# at 828

#180226 15:09:48 server id 3306116  end_log_pos 871 CRC32 0xc6b380c3    Delete_rows: table id 609 flags: STMT_END_F

### DELETE FROM `test`.`t111`

### WHERE

###   @1=11223344 /* INT meta=0 nullable=0 is_null=0 */

###   @2='dddd' /* VARSTRING(120) meta=120 nullable=1 is_null=0 */

###   @3=NULL /* VARSTRING(120) meta=120 nullable=1 is_null=1 */

# at 871


2.审计日志分析

20180226 15:09:46,XHY005116,catr1,192.168.5.116,7125,0,DISCONNECT,,,0

20180226 15:09:48,XHY005116,root,localhost,7085,51,QUERY,test,'delete from t111 where id=11223344',0

20180226 15:09:49,XHY005116,catr1,192.168.5.117,7127,0,FAILED_CONNECT,,,1049


通过两部分日志定位用户,IP,表,sql等等信息。





以上是关于Day920.结构化日志&业务审计日志 -SpringBoot与K8s云原生微服务实践的主要内容,如果未能解决你的问题,请参考以下文章

日志审计系统设计

binlog+审计日志 定位mariadb(mysql)数据库特定sql

架构 模式: 审计日志

利用auditbeat采集系统审计日志并生成图像

什么是日志审计

(转)企业配置sudo命令用户行为日志审计