亚马逊AWS官方博客

在.NET Core 环境下对日志和指标进行集中化管理

随着日益增长的业务发展,对于日志的集中化管理需求日益增加,使用Amazon CloudWatch 来对日志进行集中化管理和监控各项指标使得这项工作变得尤为简单。

CloudWatch 是一种面向开发运营工程师、开发人员、站点可靠性工程师 (SRE) 和 IT 经理的监控和可观测性服务。CloudWatch 为您提供相关数据和切实见解,以监控应用程序、响应系统范围的性能变化、优化资源利用率,并在统一视图中查看运营状况。CloudWatch 以日志、指标和事件的形式收集监控和运营数据,让您能够在统一查看在 AWS 和本地服务器上运行的资源、应用程序和服务。您可以使用 CloudWatch 检测环境中的异常行为、设置警报、并排显示日志和指标、执行自动化操作、排查问题,以及发现可确保应用程序正常运行的见解。

AWS Identity and Access Management (IAM) 使您能够安全地管理对 AWS 服务和资源的访问。您可以使用 IAM 创建和管理 AWS 用户和组,并使用各种权限来允许或拒绝他们对 AWS 资源的访问。

.NET Core 是开放源代码通用开发平台,由 Microsoft 和 .NET 社区在 GitHub 上共同维护。 它跨平台(支持 Windows、macOS 和 Linux),并且可用于生成设备、云和 IoT 应用程序。对于传统的.NET Framework 应用要部署在Linux上面临着需要重写代码的任务(如重写成Java ,PHP等),使用.NET Core平台,企业可以通过简单的代码移植,完成跨平台迁移 ,降低许可证费用。

那么为什么使用log4net来进行日志收集呢?

首先,Apache Log4Net 是一个帮助程序员将日志输出到不同目标的工具。 它是有Apache 基金会开源的优秀的日志服务组件的一部分,他也是.NET世界中的标配日志组件,经过大量的生产考验。

其次,使用log4Net 来与AWS CloudWatch 对接,能够使被动装探针收集日志转换成主动推送日志,符合一些企业的安全要求。

再者,如果系统中遗留有Log4net的日志系统,只需要简单地安装一个附加器,再进行一些配置,则可以直接完成与CloudWatch的无缝对接,无需修改任何日志打印逻辑。

利用CloudWatch可以轻松的做到如下架构:

从应用程序收集上来的日志,可以汇总到CloudWatch Logs里面,通过扫描日志来形成对应的监控指标。设定指标的阈值来形成报警,针对报警可以做到很多处理方式,如增加机器,发送消息给运维人员,或者把报警推送到诊断机器等操作。这样轻松地减少了运维工程师运维的成本。

下面介绍了如何使用.NET CORE + LOG4NET 来与CloudWatch进行集成。

为了运行在EC2上的应用程序拥有访问CloudWatch的权限,使用AWS IAM为EC2 配置一个角色,使得其拥有CloudWatch的访问权限。

 

1.跳转到IAM控制台

2.选择角色选项卡并创建角色

3.选择AWS 服务,并选中EC2以便于角色附加到EC2上。然后点击下一步。

4.点击创建策略,并跳转到JSON编辑器。

 

5.粘贴以下Json文本到到编辑器中。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cloudwatch:PutMetricData",
                "logs:CreateLogGroup"
            ],
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "logs:PutLogEvents",
            "Resource": "arn:aws:logs:*:*:log-group:*:log-stream:*"
        },
        {
            "Sid": "VisualEditor2",
            "Effect": "Allow",
            "Action": "logs:CreateLogStream",
            "Resource": "arn:aws:logs:*:*:log-group:*"
        }
    ]
}

 

6.审核策略并创建策略

7.回到角色部分,在刷新策略选择器之后,搜索刚刚创建的策略。

8.审核并设置信角色名: “role-cloud-watch-logs”

*** 如果您的EC2已经拥有相应的角色,请添加CloudWatch 和CloudWatch Logs的Write权限。

 

完成权限设定后,可以启动一台EC2作为测试环境,并附加role-cloud-watch-logs.

下面的步骤将阐述如何使用Log4Net来收集日志

  • 使用dotnet core cli / Visual Studio 创建或者打开一个项目.
  • 在Nuget中添加Logger.Log4net.

  • 配置Log4net.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <log4net>
    <appender name="awscwlogappender" type="AWS.Logger.Log4net.AWSAppender,AWS.Logger.Log4net">
      <LogGroup>scrapycorefundamental</LogGroup>
      <Region>ap-southeast-1</Region>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%type] - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ALL" />
      <appender-ref ref="awscwlogappender"/>
    </root>
  </log4net>
</configuration> 

 

  • 在程序配置好LogRepo,以及打日志代码。
using System;
using log4net;
namespace dotnet_core_cw.Logs
{
    public class LogsDemo
    {
        ILog logger = LogManager.GetLogger(typeof(LogsDemo));
        public LogsDemo()
        {
        }
        public void PrintLog()
        {
            for(int i= 0; i < 100; i++)
            {
                logger.Debug($"This is log {i}");
                logger.Info($"This is log {i}");
            }
        }
    }
}
  • 编译并上传到到EC2中,运行该程序。
  • 运行完成后,就可以在cloudwatch 中看到打印的日志。


日志组除了方便查看之外,还可以设置Expire来管理日志的生命周期,减少日志存储的费用。

也可以与S3和Elasticsearch进行无缝集成,完成更多分析功能和转储需求。

收集完日志后,可以使用日志分析工具来扫描日志分析对日志进行分析。 进入日志Insight中输入一些查询指令,就可以分析出您关心的日志指标。

演示需要,这里搜索了所有包含DEBUG的标签的日志来做指标。

通过添加到仪表板的按钮加入到仪表板进行持续观察。

以上这种日志指标观察方式为非侵入式观察,无需应用程序代码编写。通过日志分析形成观测指标。

如果项目需要通过日志来形成指标并报警,可以使用CloudWatch Logs 中的创建指标功能。

  • 选择中一个日志组,并创建指标过滤器。

  • 输入匹配项之后可以使用样例日志进行测试

  • 将日志指标打入到指定的指标名称空间

  • 回到指标面板中对应的名称空间,就可以看到相应的指标

  • 通过设定指标的阈值来进行警报设定,并触发一定的运维事件。如,增加机器或者发送消息通知运维人员等。

 

如果项目中需要对应用程序做为侵入式指标观察。则可以按照通过调用AWS CloudWatch SDK 来进行日志收集。

(1)在项目中使用nuget添加CloudWatch。

(2)安装完成之后就可以直接调用SDK来写入指标。

using Amazon.CloudWatch;
using Amazon.CloudWatch.Model;
using System;
using System.Threading;

namespace dotnet_core_cw.Metric
{
    public class MetricDemo
    {
        IAmazonCloudWatch cloudwatch;
        public MetricDemo()
        {
            cloudwatch = new AmazonCloudWatchClient(region:RegionEndpoint.APSoutheast1);
        }
        public void PrintMetric()
        {
            Random random = new Random();
            while (true)
            {
                Thread.Sleep(100);

                cloudwatch.PutMetricDataAsync(new PutMetricDataRequest()
                {
Namespace="DEMO",
                     MetricData= new System.Collections.Generic.List<MetricDatum>()
                     {
                         new MetricDatum()
                         {
                              Unit= StandardUnit.Count,
                              MetricName="DemoMetric",
                              Value =random.Next(0,100)
                         }
                     }
                }).Wait();
            }
        }
    }
}

(3)代码运行之后可以看到CloudWatch 中多了一个命名空间。

(4)稍等几分钟之后,进入到这个命名空间中,就可以看到DemoMetric 指标已经生成,并且有数据。

通过以上几种方式,可以在应用程序中收集相应的指标来进行观测和预警。

 

总结

本文介绍了在.NET Core环境下如何进行日志集中化管理。

(1)如何通过.NET Core,log4net与CloudWatch进行集成。

  • 配置CloudWatch权限
  • 安装Log4Net-Logger.Log4net..
  • 配置log4Net使用Logger.Log4net..

(2)如何通过CloudWatch Insight 进行日志分析和指标化。CloudWatch Log Insight 是一个可以对日志进行动态分析的组件,通过CloudWatch Log Insight 可以快速地从海量数据中搜索到关键信息的一个工具,也可以通过CloudWatch Log Insight 来形成非侵入式可观测指标。

(3)如何通过.NET Core的环境下如何进行指标收集。

  • 配置CloudWatch 权限
  • 在程序中进行指标收集代码编码。
  • 在CloudWatch 查看对应指标。

(4)使用Amazon CloudWatch的指标监控警报功能来对指标进行持续监控,当发现指标异常的时候出发一些行为来通知到运维人员或者完成自动化运维的动作,减少运维人员的负担,增加整个系统的健壮性。

(5)使用Amazon CloudWatch的日志文件导出和流式导出功能,方便企业进行日志审计以及不同日志系统通过Elasticsearch进行日志聚合分析。

 

本篇作者

黄金峰

AWS解决方案架构师,负责基于AWS云计算方案架构的咨询和设计,在国内推广AWS云平台技术和各种解决方案。多年分布式系统开发架构经验