日志记录
如何为 Dapr sidecar 和您的应用程序设置日志记录
在 Dapr 中,日志记录是一个关键功能,帮助开发者监控和调试应用程序。Dapr 提供了多种日志记录选项,您可以根据需求进行灵活配置。
配置 Dapr sidecar 日志
您可以通过设置环境变量来配置 Dapr sidecar 的日志记录。可以调整日志级别、输出格式等,以适应不同的需求。常见的日志级别包括 Debug
、Info
、Warning
和 Error
。
应用程序日志记录
除了 Dapr sidecar,您还可以为您的应用程序设置日志记录。通过使用 Dapr 的日志记录功能,您可以更有效地监控应用程序的行为和性能。
日志输出
Dapr 支持将日志输出到多种目标,包括控制台、文件和远程日志服务。您可以根据应用程序的部署环境选择最合适的日志输出方式。
通过合理配置日志记录,您可以更好地了解应用程序的运行状况,快速发现和解决问题。
1 - 日志
了解 Dapr 日志
Dapr 生成的结构化日志会输出到 stdout,可以选择纯文本或 JSON 格式。默认情况下,所有 Dapr 进程(包括运行时或 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 应用 ID | dapr-app |
ver | Dapr 运行时版本 | 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
{"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 sidecar 启用 JSON 格式日志
您可以通过在部署中添加 dapr.io/log-as-json: "true"
注释来为 Dapr sidecar 启用 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"
# 启用 JSON 格式的日志
dapr.io/log-as-json: "true"
...
API 日志
API 日志使您能够查看应用程序对 Dapr sidecar 的 API 调用,以调试问题或监控应用程序的行为。您可以将 Dapr API 日志与 Dapr 日志事件结合使用。
有关更多信息,请参阅 配置和查看 Dapr 日志 和 配置和查看 Dapr API 日志。
日志收集器
如果您在 Kubernetes 集群中运行 Dapr,Fluentd 是一个流行的容器日志收集器。您可以使用带有 JSON 解析器插件 的 Fluentd 来解析 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 for containers
参考资料
2 - 操作指南:在 Kubernetes 中设置 Fluentd、Elastic search 和 Kibana
如何在 Kubernetes 中安装 Fluentd、Elastic Search 和 Kibana 以搜索日志
前提条件
安装 Elastic search 和 Kibana
创建一个用于监控工具的 Kubernetes 命名空间
kubectl create namespace dapr-monitoring
添加 Elastic Search 的 Helm 仓库
helm repo add elastic https://helm.elastic.co
helm repo update
使用 Helm 安装 Elastic Search
默认情况下,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
确保 Elastic Search 和 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
作为 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
安装 Dapr 并启用 JSON 格式日志
安装 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 格式日志
在您的部署 yaml 中添加 dapr.io/log-as-json: "true"
注解。例如:
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"
...
搜索日志
注意:Elastic Search 需要一些时间来索引 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
等是否被索引。
注意:如果找不到索引字段,请稍等。搜索所有索引字段所需的时间取决于数据量和 Elastic Search 运行的资源大小。

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

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

参考资料
3 - 操作指南:为 Dapr 日志配置 New Relic
为 Dapr 日志配置 New Relic
前提条件
- 注册一个 New Relic 账户,享受每月 100 GB 的免费数据摄取、1 个免费完全访问用户和无限制的免费基本用户。
背景
New Relic 提供了一个 Fluent Bit 输出 插件,可以轻松地将日志转发到 New Relic Logs。该插件也可以作为独立的 Docker 镜像使用,并在 Kubernetes 集群中以 DaemonSet 的形式安装,我们称之为 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_KEY
Helm 2
helm install newrelic/newrelic-logging --name newrelic-logging --set licenseKey=YOUR_LICENSE_KEY
对于欧盟用户,请在上述命令中添加 --set endpoint=https://log-api.eu.newrelic.com/log/v1
。
默认情况下,日志跟踪路径设置为 /var/log/containers/*.log。要更改此设置,请在上述命令中添加 –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。
添加许可证密钥后,在终端或命令行界面中运行以下命令:
[可选] 您可以通过编辑 fluent-conf.yml 文件中的 parsers.conf 部分来配置插件如何解析数据。有关更多信息,请参阅 Fluent Bit 的 Parsers 配置文档。
默认情况下,日志跟踪路径设置为 /var/log/containers/*.log。要更改此设置,请在 new-relic-fluent-plugin.yml 文件中将默认路径替换为您首选的路径。
查看日志


相关链接/参考