Flutter 中的云日志记录

Aqe*_*med 8 firebase google-cloud-logging flutter

我想在 Flutter 移动应用中使用 Cloud Logging。另外,我会将 Cloud Logging 与 Firebase 链接起来。

有什么方法可以帮助我在 Flutter 中使用 Cloud Logging?

ven*_*lin 5

我的解决方案如下所示:创建一个只能访问日志记录的服务帐户。我创建了一个名为 的服务帐户logger,并添加了“日志编写者”权限。它只包含写日志的能力:在此输入图像描述

添加服务帐户密钥,如logger.json资产文件夹中所示。

然后将以下内容添加到 pubspec.yaml 中:

...
dependencies:
  flutter:
    sdk: flutter
...
  googleapis: ^9.2.0
  googleapis_auth: ^1.3.1
...
flutter:
...
  assets:
    - logger.json
...
Run Code Online (Sandbox Code Playgroud)

然后是一个最小的工作示例:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:googleapis/logging/v2.dart';
import 'package:googleapis_auth/auth_io.dart';

late final LoggingApi logger;

Future<void> logEvent(String descr) async {
  final Map<String, String> params = {'message': descr};
  final logEntry = LogEntry(
      logName: 'projects/<project-id>/logs/test-log',
      jsonPayload: params,
      resource: MonitoredResource(type: 'global'),
      labels: {'isWeb': '0'});
  final req = WriteLogEntriesRequest(entries: [logEntry]);
  logger.entries.write(req);
}

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final f = await rootBundle.loadString('assets/logger.json');
  AutoRefreshingAuthClient httpClient = await clientViaServiceAccount(
      ServiceAccountCredentials.fromJson(String.fromCharCodes(f.codeUnits)), [
    LoggingApi.loggingWriteScope,
  ]);

  logger = LoggingApi(httpClient);
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) => const MaterialApp(home: MyHomePage());
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    logEvent('test log no. $_counter');
    setState(() => _counter++);
  }

  @override
  Widget build(BuildContext context) => Scaffold(
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              const Text('You have pushed the button this many times:'),
              Text(
                '$_counter',
                style: Theme.of(context).textTheme.headline4,
              ),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: _incrementCounter,
          tooltip: 'Increment',
          child: const Icon(Icons.add),
        ),
      );
}
Run Code Online (Sandbox Code Playgroud)

一般来说,将服务帐户添加为资产被认为是不安全的。但由于这只能写入日志条目,所以我想这并不重要。您可以考虑对其进行编码,或使用正确的权限规则将其添加到存储中。