This is the multi-page printable view of this section. Click here to print.
日志记录
1 - 日志
Dapr 会生成结构化日志并输出到 stdout,格式可以是纯文本或 JSON。默认情况下,所有 Dapr 进程(runtime 或 sidecar,以及所有控制平面服务)以纯文本形式将日志写入控制台(stdout)。要启用 JSON 格式的日志记录,在运行 Dapr 进程时需要添加 --log-as-json 命令标志。
注意
如果你想使用 Elastic Search 或 Azure Monitor 等搜索引擎来搜索日志,强烈建议使用 JSON 格式的日志,因为日志收集器和搜索引擎可以使用内置的 JSON 解析器来解析它们。日志架构
Dapr 根据以下架构生成日志:
| 字段 | 描述 | 示例 |
|---|---|---|
| time | ISO8601 时间戳 | 2011-10-05T14:48:00.000Z |
| level | 日志级别(info/warn/debug/error) | info |
| type | 日志类型 | log |
| msg | 日志消息 | hello dapr! |
| scope | 日志记录范围 | dapr.runtime |
| instance | 容器名称 | dapr-pod-xxxxx |
| app_id | Dapr App ID | dapr-app |
| ver | Dapr Runtime 版本 | 1.9.0 |
API 日志记录可能会添加其他结构化字段,如 API 日志记录文档 中所述。
纯文本和 JSON 格式的日志
- 纯文本日志示例
time="2022-11-01T17:08:48.303776-07:00" level=info msg="starting Dapr Runtime -- version 1.9.0 -- commit v1.9.0-g5dfcf2e" instance=dapr-pod-xxxx scope=dapr.runtime type=log ver=1.9.0
time="2022-11-01T17:08:48.303913-07:00" level=info msg="log level set to: info" instance=dapr-pod-xxxx scope=dapr.runtime type=log ver=1.9.0
- JSON 格式日志示例
{"instance":"dapr-pod-xxxx","level":"info","msg":"starting Dapr Runtime -- version 1.9.0 -- commit v1.9.0-g5dfcf2e","scope":"dapr.runtime","time":"2022-11-01T17:09:45.788005Z","type":"log","ver":"1.9.0"}
{"instance":"dapr-pod-xxxx","level":"info","msg":"log level set to: info","scope":"dapr.runtime","time":"2022-11-01T17:09:45.788075Z","type":"log","ver":"1.9.0"}
日志格式
Dapr 支持输出纯文本(默认)或 JSON 格式的日志。
要使用 JSON 格式的日志,你需要在安装 Dapr 和部署应用时添加额外的配置选项。建议使用 JSON 格式的日志,因为大多数日志收集器和搜索引擎可以使用内置的解析器更轻松地解析 JSON。
使用 Dapr CLI 启用 JSON 日志记录
使用 Dapr CLI 运行应用程序时,传递 --log-as-json 选项以启用 JSON 格式的日志,例如:
dapr run \
--app-id orderprocessing \
--resources-path ./components/ \
--log-as-json \
-- python3 OrderProcessingService.py
在 Kubernetes 中启用 JSON 日志记录
以下步骤描述了如何为 Kubernetes 配置 JSON 格式的日志
Dapr 控制平面
Dapr 控制平面中的所有服务(例如 operator、sentry 等)都支持 --log-as-json 选项来启用 JSON 格式的日志记录。
如果你使用 Helm chart 将 Dapr 部署到 Kubernetes,可以通过传递 --set global.logAsJson=true 选项为 Dapr 系统服务启用 JSON 格式的日志,例如:
helm upgrade --install dapr \
dapr/dapr \
--namespace dapr-system \
--set global.logAsJson=true
为 Dapr sidecars 启用 JSON 格式的日志
你可以通过在部署中添加 dapr.io/log-as-json: "true" 注解来为 Dapr sidecars 启用 JSON 格式的日志,例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pythonapp
labels:
app: python
spec:
selector:
matchLabels:
app: python
template:
metadata:
labels:
app: python
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "pythonapp"
# This enables JSON-formatted logging
dapr.io/log-as-json: "true"
...
API 日志记录
API 日志记录使你能够查看应用程序对 Dapr sidecar 发起的 API 调用,以调试问题或监控应用程序的行为。你可以将 Dapr API 日志记录与 Dapr 日志事件结合使用。
有关更多信息,请参阅配置和查看 Dapr 日志和配置和查看 Dapr API 日志。
日志收集器
如果你在 Kubernetes 集群中运行 Dapr,Fluentd 是一个流行的容器日志收集器。你可以将 Fluentd 与 JSON 解析器插件结合使用来解析 Dapr JSON 格式的日志。这个操作指南展示了如何在集群中配置 Fluentd。
如果你使用 Azure Kubernetes Service,可以使用内置代理通过 Azure Monitor 收集日志,无需安装 Fluentd。
搜索引擎
如果你使用 Fluentd,我们建议使用 Elastic Search 和 Kibana。这个操作指南展示了如何在 Kubernetes 集群中设置 Elastic Search 和 Kibana。
如果你使用 Azure Kubernetes Service,可以使用 Azure Monitor for containers 而无需安装任何其他监控工具。另请参阅如何为容器启用 Azure Monitor
参考资料
2 - 操作指南:在 Kubernetes 中设置 Fluentd、Elasticsearch 和 Kibana
前置条件
安装 Elasticsearch 和 Kibana
为监控工具创建一个 Kubernetes 命名空间
kubectl create namespace dapr-monitoring添加 Elasticsearch 的 helm 仓库
helm repo add elastic https://helm.elastic.co helm repo update使用 Helm 安装 Elasticsearch
默认情况下,该 chart 会创建 3 个副本,这些副本必须分布在不同的节点上。如果你的集群节点数少于 3 个,请指定较小的副本数。例如,以下命令将副本数设置为 1:
helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set replicas=1否则:
helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring如果你正在使用 minikube 或只是为了开发目的想禁用持久卷,可以使用以下命令:
helm install elasticsearch elastic/elasticsearch --version 7.17.3 -n dapr-monitoring --set persistence.enabled=false,replicas=1安装 Kibana
helm install kibana elastic/kibana --version 7.17.3 -n dapr-monitoring确保 Elasticsearch 和 Kibana 在你的 Kubernetes 集群中运行
$ kubectl get pods -n dapr-monitoring NAME READY STATUS RESTARTS AGE elasticsearch-master-0 1/1 Running 0 6m58s kibana-kibana-95bc54b89-zqdrk 1/1 Running 0 4m21s
安装 Fluentd
安装 config map 和以 daemonset 方式运行的 Fluentd
下载这些配置文件:
注意:如果你的集群中已经有 Fluentd 在运行,请启用嵌套 JSON 解析器,以便它可以解析来自 Dapr 的 JSON 格式日志。
将配置应用到你的集群:
kubectl apply -f ./fluentd-config-map.yaml kubectl apply -f ./fluentd-dapr-with-rbac.yaml确保 Fluentd 作为 daemonset 运行。Fluentd 实例的数量应与集群节点数相同。在下面的示例中,集群中只有一个节点:
$ kubectl get pods -n kube-system -w NAME READY STATUS RESTARTS AGE coredns-6955765f44-cxjxk 1/1 Running 0 4m41s coredns-6955765f44-jlskv 1/1 Running 0 4m41s etcd-m01 1/1 Running 0 4m48s fluentd-sdrld 1/1 Running 0 14s
安装支持 JSON 格式日志的 Dapr
安装 Dapr 并启用 JSON 格式日志
helm repo add dapr https://dapr.github.io/helm-charts/ helm repo update helm install dapr dapr/dapr --namespace dapr-system --set global.logAsJson=true在 Dapr sidecar 中启用 JSON 格式日志
将
dapr.io/log-as-json: "true"注解添加到你的 deployment yaml 中。例如:apiVersion: apps/v1 kind: Deployment metadata: name: pythonapp namespace: default labels: app: python spec: replicas: 1 selector: matchLabels: app: python template: metadata: labels: app: python annotations: dapr.io/enabled: "true" dapr.io/app-id: "pythonapp" dapr.io/log-as-json: "true" ...
搜索日志
注意:Elasticsearch 需要一些时间来索引 Fluentd 发送的日志。
从本地端口转发到
svc/kibana-kibana$ kubectl port-forward svc/kibana-kibana 5601 -n dapr-monitoring Forwarding from 127.0.0.1:5601 -> 5601 Forwarding from [::1]:5601 -> 5601 Handling connection for 5601 Handling connection for 5601浏览到
http://localhost:5601展开下拉菜单并点击 Management → Stack Management

在 Stack Management 页面上,选择 Data → Index Management 并等待
dapr-*被索引。
一旦
dapr-*被索引,点击 Kibana → Index Patterns,然后点击 Create index pattern 按钮。
通过在 Index Pattern name 字段中输入
dapr*来定义新的索引模式,然后点击 Next step 按钮继续。
通过从 Time field 下拉列表中选择
@timestamp选项,配置与新索引模式一起使用的主时间字段。点击 Create index pattern 按钮完成索引模式的创建。
应该显示新创建的索引模式。通过使用 Fields 选项卡中的搜索框,确认感兴趣的字段(如
scope、type、app_id、level等)正在被索引。注意:如果你找不到索引字段,请稍候。搜索所有索引字段所需的时间取决于数据量和运行 Elasticsearch 的资源大小。

要浏览索引数据,展开下拉菜单并点击 Analytics → Discover。

在搜索框中输入查询字符串,例如
scope:*,然后点击 Refresh 按钮查看结果。注意:这可能需要很长时间。返回所有结果所需的时间取决于数据量和运行 Elasticsearch 的资源大小。

参考
3 - 如何设置:为 Dapr 日志配置 New Relic
前提条件
- 永久免费的 New Relic 账户,每月 100 GB 的免费数据摄入,1 个免费的全权限用户,无限个免费基础用户
背景
New Relic 提供了一个 Fluent Bit 输出插件,可以轻松将日志转发到 New Relic Logs。该插件也以独立的 Docker 镜像形式提供,可以以 DaemonSet 的形式安装在 Kubernetes 集群中,我们称之为 Kubernetes 插件。
本文档介绍了如何在集群中安装该插件,可以使用 Helm chart(推荐),或者通过手动应用 Kubernetes 清单文件。
安装
使用 Helm chart 安装(推荐)
按照官方说明安装 Helm。
按照这些说明添加 New Relic 官方 Helm chart 仓库
运行以下命令通过 Helm 安装 New Relic Logging Kubernetes 插件,将占位符值 YOUR_LICENSE_KEY 替换为您的 New Relic 许可证密钥:
Helm 3
helm install newrelic-logging newrelic/newrelic-logging --set licenseKey=YOUR_LICENSE_KEYHelm 2
helm install newrelic/newrelic-logging --name newrelic-logging --set licenseKey=YOUR_LICENSE_KEY
对于欧盟用户,请在上述任何 helm install 命令中添加 --set endpoint=https://log-api.eu.newrelic.com/log/v1。
默认情况下,日志跟踪设置为 /var/log/containers/*.log。要更改此设置,请在上述任何 helm install 命令中添加 –set fluentBit.path=DESIRED_PATH 来提供您首选的路径。
安装 Kubernetes 清单文件
将以下 3 个清单文件下载到当前工作目录:
curl https://raw.githubusercontent.com/newrelic/helm-charts/master/charts/newrelic-logging/k8s/fluent-conf.yml > fluent-conf.yml curl https://raw.githubusercontent.com/newrelic/helm-charts/master/charts/newrelic-logging/k8s/new-relic-fluent-plugin.yml > new-relic-fluent-plugin.yml curl https://raw.githubusercontent.com/newrelic/helm-charts/master/charts/newrelic-logging/k8s/rbac.yml > rbac.yml在下载的 new-relic-fluent-plugin.yml 文件中,将占位符值 LICENSE_KEY 替换为您的 New Relic 许可证密钥。
对于欧盟用户,将 ENDPOINT 环境变量替换为 https://log-api.eu.newrelic.com/log/v1。
添加许可证密钥后,在终端或命令行界面中运行以下命令:
kubectl apply -f .[可选] 您可以通过编辑 fluent-conf.yml 文件中的 parsers.conf 部分来配置插件如何解析数据。有关更多信息,请参阅 Fluent Bit 关于 Parsers 配置的文档。
默认情况下,日志跟踪设置为 /var/log/containers/*.log。要更改此设置,请在 new-relic-fluent-plugin.yml 文件中将默认路径替换为您首选的路径。
查看日志

