框架模块说明 #09 日志模块_01

发布于:2025-02-11 ⋅ 阅读:(31) ⋅ 点赞:(0)

背景

日志模块是系统的重要组成部分,主要负责记录系统运行状态和定位错误问题的功能。通常,日志分为系统日志、操作日志和安全日志三类。虽然分布式数据平台是当前微服务架构中的重要部分,但本文的重点并不在此,而是聚焦于自定义 Appender 及一些成熟 Appender 的介绍。针对操作日志,我们仍然采用切面编程的方式。鉴于日志数量较大的特点,我们选择使用 MongoDB 进行日志存储,而未采用传统的日志平台解决方案。

本系统采用的日志方案是logback,所以下面的一些appender也是继承

ch.qos.logback.core.Appender类。

MongoDBAppender

类图

代码实现

实现也就是按服务分别存储到日志的集合中,同时也存储个日期,方便日后日志的清空操作。

@Override
    protected void append(ILoggingEvent eventObject) {
        if (mongoTemplate == null) {
            mongoTemplate = SpringContextUtil.getBean(MongoTemplate.class);
        } else {
            if ("DEBUG".equals(eventObject.getLevel().toString())) {
                return;
            }
            String microServiceName = EnvUtil.single().getEnv("spring.application.name", "").toUpperCase();
            String activeProfile = EnvUtil.single().getEnv("spring.profiles.active", "").toUpperCase();
            final String documentName = microServiceName + "_" + activeProfile + CoreConstant.MongoDbLogConfig.MONGODB_LOG_SUFFIX.value();
            final BasicDBObject doc = new BasicDBObject();
            doc.append("level", eventObject.getLevel().toString());
            doc.append("logger", eventObject.getLoggerName());
            doc.append("thread", eventObject.getThreadName());
            doc.append("message", eventObject.getFormattedMessage());
            doc.append("microServiceName", microServiceName);
            try {
                doc.append("getArgumentArray", JSON.toJSONString(eventObject.getArgumentArray()));
            } catch (Exception e) {
                logger.error("日志参数转换错误!");
            }
            doc.append(CoreConstant.MongoDbLogConfig.CREATE_DATE_FIELD.value(), new Date(eventObject.getTimeStamp()));
            mongoTemplate.insert(doc, documentName);
        }
    }

JSON日志配置

引用包

要注意版本,如果启动有问题,可以根据异常去查找下,网上会给出正确的版本,我用的是springboot2.7.3,这里就用7.3版本。

    <dependency>
      <groupId>net.logstash.logback</groupId>
      <artifactId>logstash-logback-encoder</artifactId>
      <version>7.3</version>
    </dependency>

logback配置

根据实际情况减少或者增加内容

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <!-- 日志时间 -->
                <timestamp>
                    <timeZone>UTC+08:00</timeZone>
                </timestamp>
                <!-- 日志级别 -->
                <logLevel/>
                <pattern>
                    <pattern>
                        {
                        "file": "%file",
                        "class": "%logger",
                        "line": "%line"
                        }
                    </pattern>
                </pattern>
                <!-- 线程名称 -->
                <threadName/>
                <!-- 记录器名称 -->
                <loggerName/>
                <!-- 日志消息 -->
                <message/>
                <!-- 异常堆栈信息 -->
                <stackTrace/>
                <!-- 自定义字段(如果有) -->
                <mdc/>
                <!-- repeats log arguments as root json fields -->
                <arguments/>
                <logstashMarkers/>
            </providers>
        </encoder>
    </appender>

总结

在第二篇中我将对操作日志和安全日志的实现进行一些处理,本节相关代码链接如下。

GitCode - 全球开发者的开源社区,开源代码托管平台GitCode是面向全球开发者的开源社区,包括原创博客,开源代码托管,代码协作,项目管理等。与开发者社区互动,提升您的研发效率和质量。icon-default.png?t=O83Ahttps://gitcode.com/YouYouLongLong/springcloud-framework/blob/master/core-common-parent/logs-common/src/main/java/org/cloud/logger/MongoDBAppender.java


网站公告

今日签到

点亮在社区的每一天
去签到