Golang日志实战教程:掌握log与syslog库的高效使用

news2024/12/28 3:38:14

Golang日志实战教程:掌握log与syslog库的高效使用

    • 简介
    • 理解 Golang 的 log 库
      • 基本概念
      • 创建日志记录器
      • 自定义日志记录器
      • 日志级别
    • 深入 syslog
      • syslog 的基础
      • 配置和使用 syslog
      • 高级应用
    • 日志格式化与管理
      • 日志格式化
      • 日志文件管理
    • 日志的高级应用
      • 集成第三方日志框架
        • 使用 logrus
        • 使用 zap
      • 在分布式系统中管理日志
      • 日志的安全性和隐私
    • 实战案例
      • 案例一:使用 log 包实现基础日志记录
      • 案例二:使用 syslog 进行系统级日志记录
      • 案例三:集成 logrus 实现高级日志功能
    • 常见问题及其解决方案
      • 问题一:日志文件过大如何处理?
      • 问题二:如何确保日志的安全性?
      • 问题三:日志性能影响如何最小化?
      • 问题四:如何管理分布式系统中的日志?
    • 总结
      • 重要观点回顾
      • 向前展望

在这里插入图片描述

简介

在现代软件开发中,日志记录是一个不可或缺的功能,它帮助开发者跟踪应用程序的运行状态、监控程序行为、分析问题原因以及进行系统安全审核。在 Go 语言中,标准库提供了基础但功能强大的日志处理机制,尤其是 logsyslog 两个库,它们分别应对应用层面的日志需求和系统级的日志管理。本文将详细介绍如何在 Go 语言中使用这两个库,从基本的日志记录到复杂的日志管理,再到实战应用,旨在为中高级 Golang 开发者提供一个全面的学习和参考手册。

日志不仅仅是简单地输出信息到控制台或文件,更是一种软件运行的实时文档,它记录了软件的生命周期中的各种重要事件。合理地设计和实施日志管理策略,可以极大地提升应用程序的可维护性和可调试性。在阅读本文后,您将掌握使用 Golang logsyslog 库进行有效日志记录的各种技巧和方法,这些技巧包括但不限于日志格式化、日志级别控制、日志文件管理,以及如何将日志整合到更大的系统监控或日志分析工具中。

通过本文的学习,您将能够:

  1. 理解 logsyslog 库的核心功能和使用场景。
  2. 掌握如何在 Golang 项目中实现有效的日志记录策略。
  3. 学习如何通过日志提升代码的可调试性和项目的可维护性。
  4. 获得在实际项目中应用这些日志技术的能力。

本文将通过理论介绍与实战示例相结合的方式,帮助您深入理解并有效应用 Golang 的日志处理技术。接下来,我们将从 Golang 的 log 库开始,介绍它的基本概念和使用方法。

理解 Golang 的 log 库

在 Go 语言中,log 库提供了简单而强大的日志记录功能。它支持基础的日志操作,如输出信息到标准输出、文件等,并允许通过不同的日志级别来控制输出的详细程度。这一部分将详细介绍如何使用 log 库进行日志记录,包括基本概念、创建日志记录器以及日志级别的应用。

基本概念

log 库在 Golang 中是用于基本日志记录的标凈工具。它的主要特点包括:

  • 简单性:使用极其简单,可快速集成到任何 Golang 程序中。
  • 灵活性:支持定制前缀、日志格式和输出位置。
  • 并发安全:内置的日志记录器是并发安全的,可以在多协程环境中无忧使用。

创建日志记录器

使用 log 库的第一步是创建一个日志记录器。默认的日志记录器会输出到标准错误(stderr),并包含日期和时间。例如:

package main

import (
    "log"
)

func main() {
    log.Println("这是一条日志消息")
}

此代码会输出类似以下内容,显示了日志生成的日期和时间:

2009/11/10 23:00:00 这是一条日志消息

自定义日志记录器

虽然默认的日志记录器对于简单应用足够用,但在更复杂的应用中,您可能需要更多控制。创建自定义日志记录器非常简单,您可以指定输出目的地、日志格式和前缀。例如:

package main

import (
    "log"
    "os"
)

func main() {
    // 创建一个文件用于记录日志
    file, err := os.OpenFile("example.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    // 创建一个日志记录器,输出到文件
    logger := log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)

    logger.Println("这是一条自定义的日志消息")
}

此代码会将日志消息写入 example.log 文件,并在每条日志消息前添加 "INFO: " 标签和其他日志详情,如日期、时间和文件名。

日志级别

虽然 log 库本身不直接支持日志级别,但您可以通过简单的逻辑来实现这一功能,或者使用更高级的第三方库如 logruszap 来提供更复杂的日志级别管理。在这部分的末尾,我们将讨论如何集成这些第三方库。

深入 syslog

在 Unix-like 系统中,syslog 是一个标准的错误日志系统,它为操作系统和应用程序提供日志服务。在 Go 语言中,通过标准库中的 log/syslog 包,开发者可以直接与系统的 syslog 服务交互,实现更高级的日志管理。这一部分将探讨如何在 Golang 中使用 syslog 包,包括其基本用法和一些高级特性。

syslog 的基础

syslog 服务允许不同的程序将它们的日志信息发送到统一的集中管理系统,这有助于日志数据的集中处理和监控。使用 log/syslog 包可以简化这一过程,示例如下:

package main

import (
    "log/syslog"
    "log"
)

func main() {
    logger, err := syslog.New(syslog.LOG_INFO|syslog.LOG_LOCAL0, "MyApp")
    if err != nil {
        log.Fatal(err)
    }

    logger.Info("这是通过 syslog 发送的信息")
}

在这个示例中,我们创建了一个 syslog 日志记录器,指定了日志级别和设施代码。LOG_INFO 是日志级别,LOG_LOCAL0 是一种设施代码,用于指定日志消息的来源类别。MyApp 是这些日志消息的标识符。

配置和使用 syslog

配置 syslog 通常涉及到指定它应该如何处理来自不同源的日志。在 Go 应用中使用 syslog 时,您可以通过代码控制日志的重要性和分类。您还可以配置系统的 syslog 服务来执行如日志轮转、过滤等操作。

高级应用

尽管 log/syslog 包为与系统日志服务的交互提供了基本的工具,但在复杂的或高度定制的环境中,您可能需要直接与 syslog 守护进程交互的更高级功能。例如,您可以使用网络协议发送日志到远程的 syslog 服务器,从而实现集中日志管理。这可以通过扩展 syslog 包或使用第三方库来完成。

package main

import (
    "log/syslog"
    "log"
)

func main() {
    logger, err := syslog.Dial("tcp", "192.168.0.1:514", syslog.LOG_WARNING|syslog.LOG_DAEMON, "MyApp")
    if err != nil {
        log.Fatal(err)
    }

    logger.Warning("这是发送到远程 syslog 服务器的警告")
}

这个示例演示了如何通过 TCP 协议将日志消息发送到指定的远程 syslog 服务器。这类配置非常适用于分布式系统,其中日志的集中收集和分析变得尤为重要。

日志格式化与管理

良好的日志管理不仅涉及到如何生成日志,更重要的是如何格式化和维护这些日志文件。在 Go 中,通过 log 库及其它工具,我们可以实现高效的日志格式化和管理策略,以保证日志的可读性和易管理性。本部分将介绍如何在 Golang 中格式化日志输出和管理日志文件。

日志格式化

日志的格式化是确保日志信息可读和有用的关键。在 Golang 的 log 包中,可以通过设置不同的输出格式来调整日志的显示。这包括日期、时间、文件名和代码行号等信息的显示,这些信息对于后续的日志分析非常有帮助。例如:

package main

import (
    "log"
    "os"
)

func main() {
    // 创建日志文件
    file, err := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    // 设置日志输出格式
    logger := log.New(file, "INFO: ", log.Ldate|log.Ltime|log.Llongfile)

    // 记录日志
    logger.Println("日志消息示例:程序启动")
}

在这个例子中,log.Ldate, log.Ltime, 和 log.Llongfile 选项使得每条日志前都会加上日期、时间和详细的文件位置,这对于调试过程中快速定位问题非常有用。

日志文件管理

随着应用程序的运行,日志文件可能会非常快速地增长。为了管理这些文件并防止它们占用过多的磁盘空间,常见的做法是实现日志轮转。虽然 Golang 的 log 包本身不提供直接的日志轮转功能,但我们可以使用第三方库如 lumberjack 来轻松实现:

package main

import (
    "log"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    logger := log.New(&lumberjack.Logger{
        Filename:   "app.log",
        MaxSize:    10, // megabytes
        MaxBackups: 3,
        MaxAge:     28, //days
    }, "INFO: ", log.Ldate|log.Ltime|log.Lshortfile)

    logger.Println("这是一条日志消息,将被自动轮转")
}

在此示例中,lumberjack 日志处理器将自动管理日志文件的大小和轮转。当文件大小超过 10MB 或者文件超过指定的保留天数时,旧文件将被删除或归档。

通过有效的日志格式化和管理策略,您的应用不仅能保持良好的性能,也能在出现问题时提供强大的支持和快速的解决方案。

日志的高级应用

随着应用程序的复杂性增加,仅仅使用基本的日志记录功能可能不足以满足开发和维护的需要。高级日志应用可以提供更深入的数据分析、更灵活的日志处理和更高效的性能优化。本部分将探讨在 Golang 中实现日志的高级应用技巧,包括集成第三方日志框架、在分布式系统中管理日志以及处理日志的安全性和隐私问题。

集成第三方日志框架

虽然 Golang 的标准库提供了基础的日志记录功能,但在更复杂的场景中,使用第三方日志库如 logruszap 可以带来更多的灵活性和功能。这些库提供了如日志级别管理、结构化日志和异步日志记录等高级功能。

使用 logrus

logrus 是一个流行的 Golang 日志库,支持完全的日志级别管理和结构化日志,非常适合需要复杂日志系统的应用程序。示例代码如下:

package main

import (
    "github.com/sirupsen/logrus"
)

func main() {
    log := logrus.New()
    log.Formatter = &logrus.JSONFormatter{}

    log.WithFields(logrus.Fields{
        "username": "example_user",
        "step":     "initialization",
    }).Info("程序启动")

    log.WithFields(logrus.Fields{
        "username": "example_user",
        "step":     "processing",
    }).Warn("处理过程中发生警告")
}

此代码设置了 logrus 使用 JSON 格式输出,并添加了额外的字段来增强日志的描述性和分析性。

使用 zap

zap 是另一个高性能的日志框架,特别适合于性能敏感的应用。它的设计允许日志记录几乎不影响应用程序的性能。

package main

import (
    "go.uber.org/zap"
)

func main() {
    logger, _ := zap.NewProduction()

    logger.Info("程序启动",
        zap.String("stage", "initialization"),
        zap.Int("step", 1),
    )

    logger.Warn("处理警告",
        zap.String("stage", "data processing"),
        zap.Int("step", 2),
    )

    logger.Sync()
}

在这个例子中,zap 提供了异步的日志记录功能,并能够通过结构化的方式提供丰富的日志信息。

在分布式系统中管理日志

在分布式系统中,日志管理尤为重要,因为它涉及到多个组件和服务。使用如 Elasticsearch, Logstash, 和 Kibana (ELK) 堆栈可以帮助集中管理和分析日志。

日志的安全性和隐私

处理日志时,确保敏感数据的安全和用户隐私是至关重要的。遵守 GDPR 或 HIPAA 等法规,在日志中避免记录敏感信息,或使用加密和访问控制来保护日志数据。

实战案例

为了更好地理解如何将日志应用于实际开发中,本部分将提供一些具体的编程实战案例,展示如何在实际的 Golang 项目中有效使用 logsyslog,以及如何集成第三方日志框架来处理更复杂的日志需求。

案例一:使用 log 包实现基础日志记录

在这个示例中,我们将创建一个简单的应用程序,该程序使用 Golang 的标准 log 库记录关键操作的日志。

package main

import (
    "log"
    "os"
)

func main() {
    // 配置日志输出到文件
    file, err := os.OpenFile("basic.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666)
    if err != nil {
        log.Fatal("无法打开日志文件: ", err)
    }
    defer file.Close()

    log.SetOutput(file)
    log.Println("程序启动,开始执行操作...")

    // 执行一些操作
    log.Println("执行重要操作1")
    log.Println("执行重要操作2")
    log.Println("程序执行结束。")
}

这个简单的例子展示了如何设置日志输出到文件,并记录了程序的关键步骤。

案例二:使用 syslog 进行系统级日志记录

在此案例中,我们将演示如何使用 syslog 包将日志信息发送到本地系统的日志处理器。

package main

import (
    "log/syslog"
    "log"
)

func main() {
    logger, err := syslog.New(syslog.LOG_NOTICE|syslog.LOG_LOCAL0, "MyGolangApp")
    if err != nil {
        log.Fatal("无法创建 syslog 记录器: ", err)
    }

    logger.Notice("应用程序启动,开始执行操作...")
    logger.Notice("执行系统级重要操作")
    logger.Notice("应用程序执行结束。")
}

这个例子使用 syslog 进行更为正式和系统级的日志记录,适用于需要集成到系统日志管理中的应用程序。

案例三:集成 logrus 实现高级日志功能

这个案例展示如何使用 logrus 来实现结构化日志,便于后续的日志分析和处理。

package main

import (
    "github.com/sirupsen/logrus"
)

func main() {
    log := logrus.New()
    log.SetFormatter(&logrus.JSONFormatter{})

    log.WithFields(logrus.Fields{
        "event": "application_start",
        "topic": "startup",
    }).Info("应用程序启动")

    // 执行一些重要操作
    log.WithFields(logrus.Fields{
        "event": "operation",
        "topic": "critical",
    }).Info("执行重要操作")

    log.WithFields(logrus.Fields{
        "event": "application_end",
        "topic": "shutdown",
    }).Info("应用程序关闭")
}

在这个案例中,logrus 被用来生成 JSON 格式的日志,这些日志可以被日志管理系统如 ELK 堆栈等更容易地解析和分析。

常见问题及其解决方案

在使用 Golang 进行日志记录时,开发者可能会遇到一系列常见问题。本部分将探讨这些问题并提供实用的解决方案,帮助开发者提高日志管理的效率和效果。

问题一:日志文件过大如何处理?

随着应用程序的使用,日志文件大小不断增加,可能会消耗过多的磁盘空间,影响系统性能。

解决方案:
使用日志轮转策略。可以利用如 lumberjack 这样的库来自动管理日志文件的大小和备份。示例代码如下:

package main

import (
    "log"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    log.SetOutput(&lumberjack.Logger{
        Filename:   "app.log",
        MaxSize:    5,   // megabytes
        MaxBackups: 3,
        MaxAge:     28,  // days
    })

    log.Println("这是一条会被自动管理的日志消息")
}

问题二:如何确保日志的安全性?

在记录日志时,可能会不小心记录敏感信息,这可能导致安全问题。

解决方案:
确保在日志中不记录任何敏感信息,或使用数据脱敏技术来处理敏感数据。同时,可以使用文件权限设置或加密来保护日志文件。

问题三:日志性能影响如何最小化?

日志记录可能会影响应用程序的性能,特别是在高负载或高频写入的场景。

解决方案:
使用异步日志记录技术。可以选择使用 zap 日志库,它专为高性能而设计,并提供异步日志处理能力。

package main

import (
    "go.uber.org/zap"
)

func main() {
    logger, _ := zap.NewProduction()

    defer logger.Sync() // Flushes buffer, if any
    sugar := logger.Sugar()
    sugar.Infow("异步日志消息", "location", "main", "type", "example")
}

问题四:如何管理分布式系统中的日志?

在分布式系统中,日志管理可能变得复杂,需要从多个服务收集和汇总日志。

解决方案:
使用集中式日志管理工具,如 ELK 堆栈或 Fluentd,来收集和分析来自所有组件的日志。

这些问题和解决方案只是日志记录中遇到的一部分挑战的例子,通过这些策略,开发者可以提高日志系统的可用性和安全性。

总结

在本文中,我们详细探讨了如何在 Golang 中有效使用 logsyslog 库进行日志记录,从基础用法到高级技术,再到实战案例和常见问题的解决。我们了解到,合理的日志管理不仅能帮助开发者监控应用程序的运行状态,还能提高程序的可维护性和调试的效率。

重要观点回顾

  • 基础日志技术:使用 Golang 的 log 库进行简单的日志记录。
  • 系统级日志:通过 syslog 进行更广泛的系统级日志管理。
  • 日志格式化与管理:采用适当的格式化和管理技术,如日志轮转,以保持日志文件的可管理性和高效性。
  • 高级应用:集成第三方库如 logruszap 来实现结构化日志和高性能日志记录。
  • 实战案例:通过实际示例展示了日志技术的应用,帮助开发者更好地理解并实际操作。
  • 解决常见问题:提供了针对常见日志问题的解决策略,增强了日志系统的整体效能和安全性。

向前展望

有效的日志管理策略将继续是软件开发和维护中的关键组成部分。随着技术的发展和应用需求的变化,新的日志处理工具和方法将不断出现。开发者应持续关注这些变化,不断学习和适应,以充分利用日志数据支持软件质量的提升和运维效率的增加。

最后,希望本文能为您在使用 Golang 进行日志记录时提供有价值的参考和指导。无论您是正在寻找解决特定日志问题的方法,还是希望优化现有的日志系统,都可以在本文中找到适用的技术和建议。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1647811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python程序中温度更新出现振荡问题的分析和解决方案

在处理温度更新出现振荡问题时,可以考虑以下分析和解决方案:检查温度更新算法是否正确,可能存在错误导致振荡。检查温度更新的步长(时间步长)是否合适,步长过大可能导致振荡。检查系统动力学模型是否准确&a…

场外个股期权和场内个股期权的优缺点是什么?

场外个股期权和场内个股期权的优缺点 场外个股期权是指在沪深交易所之外交易的个股期权,其本质是一种金融衍生品,允许投资者在股票交易场所外以特定价格买进或卖出证券。场内个股期权是以单只股票作为标的资产的期权合约,其内在价值是基于标…

如何用Kimi,5秒1步生成流程图

引言 在当前快节奏的工作环境中,拥有快速、专业且高效的工具不可或缺。 Kimi不仅能在5秒内生成专业的流程图(kimi),还允许实时编辑和预览,大幅简化了传统流程图的制作过程。 这种迅速的生成能力和高度的可定制性使得…

员工账号生命周期如何“全场景”自动化管理?

当企业在信息化建设中引入越来越多的业务系统时,必然存在系统内账号互相独立、无法打通的情况。一有人事变动,HR、IT 管理员、应用管理员、业务部门主管等人就需要在系统里手动更新账号状态。重复、低效,且不可避免出现安全隐患。困扰着 IT 管…

冯喜运:5.7全球紧张局势中,黄金原油投资者转向需谨慎

【黄金消息面分析】:周一(5月6日),现货黄金触底回升,盘中交投于2320美元附近。自美国4月非农就业数据出炉和美联储主席鲍威尔货币政策新闻发布会以后,现货黄金从4月12日的历史高点2431美元下跌了大约6.3%&a…

AI口语对话训练有哪些软件?推荐这5款,简单易用

AI口语对话训练有哪些软件?AI口语对话训练软件在近年来得到了飞速的发展,为语言学习者提供了更为便捷、高效的学习方式。它们借助先进的自然语言处理技术和机器学习算法,不仅模拟了真实对话场景,还提供了个性化的学习建议和即时反…

笔试强训Day15 二分 图论

平方数 题目链接&#xff1a;平方数 (nowcoder.com) 思路&#xff1a;水题直接过。 AC code&#xff1a; #include<iostream> #include<cmath> using namespace std; int main() {long long int n; cin >> n;long long int a sqrtl(n);long long int b …

苏州金龙荣获首届无人扫地机器人演示比赛“竞技领跑奖”

4月30日&#xff0c;2024年苏州市首届无人扫地机器人演示比赛在高新区思益街展开比拼。五家企业参赛在道路上实地比拼无人扫地机器人技术&#xff0c;通过清扫垃圾、识别路障等环节展现城市清洁的“未来场景”。经过角逐&#xff0c;苏州金龙的无人驾驶清扫车获得步道演示比赛“…

送给正在入行的小白:最全最有用的网络安全学习路线已经安排上了

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 第一个方向&#xff1a;安全研发 你可以把网络安全理解成电商行业、教育行业等其他行业一样&#xf…

centos7.9系统rabbitmq3.8.5升级为3.8.35版本

说明 本文仅适用rabbitmq为RPM安装方式。 升级准备 查看环境当前版本&#xff1a; # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # rabbitmqctl status Status of node rabbitmq01 ... RuntimeOS PID: 19333 OS: Linux Uptime (seconds): 58 Is under …

Ollama +Docker+OpenWebUI

1 Ollama 1.1 下载Ollama https://ollama.com/download 1.2 运行llama3 $ ollama run llama3 pulling manifest pulling 00e1317cbf74... 100% ▕███████████████████████████████████████████████████████████…

Java 运行的底层原理

Java是一种跨平台的编程语言&#xff0c;其底层原理涉及到了多个方面&#xff0c;包括Java虚拟机&#xff08;JVM&#xff09;、字节码、类加载机制、垃圾回收器等。让我们逐一深入了解Java运行的底层原理。 1. Java虚拟机&#xff08;JVM&#xff09; Java虚拟机是Java程序运…

【前端】HTML基础(1)

文章目录 前言一、什么是前端二、HTML基础1、 HTML结构1.1 什么是HTML页面1.2 认识HTML标签1.3 HTML文件基本结构1.3 标签层次结构1.4 创建html文件1.5 快速生成代码框架 三、Emmet快捷键 前言 这篇博客仅仅是对HTML的基本结构进行了一些说明&#xff0c;关于HTML的更多讲解以及…

我国烟雾报警器市场规模逐渐增长 市场集中度相对较低

我国烟雾报警器市场规模逐渐增长 市场集中度相对较低 烟雾报警器又称为烟雾探测器、烟感报警器等&#xff0c;是用于检测室内烟雾浓度、实现火灾防范的一种安全设备。烟雾报警器具有反应速度快、灵敏度高、功耗低等优点。根据工作原理不同&#xff0c;烟雾报警器可分为热敏式、…

使用Vue3开发项目,搭建Vue cli3项目步骤

1.打开cmd &#xff0c;输入 vue create neoai遇到这样的问题 则需要升级一下电脑上 Vue Cli版本哈 升级完成之后 再次输入命令&#xff0c;创建vue3项目 vue create neoai安装完成后&#xff0c;输入 npm run serve 就可以运行项目啦~ 页面运行效果

【网络知识】光猫、路由器 和 交换机 的作用和区别?

数字信号&#xff1a;是指自变量是离散的、因变量也是离散的信号&#xff0c;这种信号的自变量用整数表示&#xff0c;因变量用有限数字中的一个数字来表示。在计算机中&#xff0c;数字信号的大小常用有限位的二进制数表示。 模拟信号&#xff1a;模拟信号是指用连续变化的物…

map、set底层封装模拟实现(红黑树)

文章目录 一、红黑树1.1红黑树的规则&#xff1a;1.2红黑树的插入操作1.2.1不需要旋转&#xff08;如果叔叔存在且为红,这里的C表示孩子&#xff0c;P表示父亲&#xff0c;U表示叔叔&#xff0c;G表示祖父&#xff09;&#xff0c;包含四种情况&#xff0c;无论孩子在哪里&…

复杂事件处理(CEP)引擎白皮书正式发布!

流数据是一种持续实时生成且动态变化的时间序列数据&#xff0c;涵盖了金融交易、物联网&#xff08;IoT&#xff09;传感器采集、物流运营、零售订单等各类持续生成动态数据的场景。 传统的流计算引擎能够高效地处理单一结构的数据流&#xff0c;不能应对需要识别数据流中的事…

VMware虚拟网卡网络适配器出现黄色感叹号

问题发生&#xff1a;VMware在使用Ubuntu的过程中突然卡死&#xff0c;强制关闭开启后就发生了网络无法连接 找到电脑的设备管理发现VMware的适配器出现黄色感叹号 解决方法&#xff1a; 下载软件ccleaner 扫描问题&#xff0c;懒得去找就修复了所有的问题 最后发现适配器…

jenkins+gitlab+ansible-tower实现发布

前提准备&#xff1a; gitlab中上传相应的jenkinsfile文件和源码。 安装和破解ansible-tower。 安装jenkins。 大致流程&#xff1a;从gitlab中拉取文件&#xff0c;存放到windows机器上&#xff0c;使用nuget等进行打包到windows中&#xff0c;使用sshPublisher语句传输到远程…