[unified_analytics] Suppress any `FileSystemException` thrown during `Analytics.send` (#274)

diff --git a/pkgs/unified_analytics/CHANGELOG.md b/pkgs/unified_analytics/CHANGELOG.md
index 3cebcf2..b28088a 100644
--- a/pkgs/unified_analytics/CHANGELOG.md
+++ b/pkgs/unified_analytics/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 6.1.1
+
+- Fixed bug where calling `Analytics.send` could result in a `FileSystemException` when unable to write to a log file.
+
 ## 6.1.0
 
 - Added new event constructor `Event.devtoolsEvent` for the single devtools event with a new enum value `DashEvent.devtoolsEvent`
diff --git a/pkgs/unified_analytics/lib/src/constants.dart b/pkgs/unified_analytics/lib/src/constants.dart
index eb84834..9ac9d1a 100644
--- a/pkgs/unified_analytics/lib/src/constants.dart
+++ b/pkgs/unified_analytics/lib/src/constants.dart
@@ -82,7 +82,7 @@
 const String kLogFileName = 'dart-flutter-telemetry.log';
 
 /// The current version of the package, should be in line with pubspec version.
-const String kPackageVersion = '6.1.0';
+const String kPackageVersion = '6.1.1';
 
 /// The minimum length for a session.
 const int kSessionDurationMinutes = 30;
diff --git a/pkgs/unified_analytics/lib/src/log_handler.dart b/pkgs/unified_analytics/lib/src/log_handler.dart
index 6a0f058..d611b73 100644
--- a/pkgs/unified_analytics/lib/src/log_handler.dart
+++ b/pkgs/unified_analytics/lib/src/log_handler.dart
@@ -275,15 +275,20 @@
     var records = logFile.readAsLinesSync();
     final content = '${jsonEncode(data)}\n';
 
-    // When the record count is less than the max, add as normal;
-    // else drop the oldest records until equal to max
-    if (records.length < kLogFileLength) {
-      logFile.writeAsStringSync(content, mode: FileMode.writeOnlyAppend);
-    } else {
-      records.add(content);
-      records = records.skip(records.length - kLogFileLength).toList();
+    try {
+      // When the record count is less than the max, add as normal;
+      // else drop the oldest records until equal to max
+      if (records.length < kLogFileLength) {
+        logFile.writeAsStringSync(content, mode: FileMode.writeOnlyAppend);
+      } else {
+        records.add(content);
+        records = records.skip(records.length - kLogFileLength).toList();
 
-      logFile.writeAsStringSync(records.join('\n'));
+        logFile.writeAsStringSync(records.join('\n'));
+      }
+    } on FileSystemException {
+      // Logging isn't important enough to warrant raising a
+      // FileSystemException that will surprise consumers of this package.
     }
   }
 }
diff --git a/pkgs/unified_analytics/pubspec.yaml b/pkgs/unified_analytics/pubspec.yaml
index ed96d60..11c778b 100644
--- a/pkgs/unified_analytics/pubspec.yaml
+++ b/pkgs/unified_analytics/pubspec.yaml
@@ -4,7 +4,7 @@
   to Google Analytics.
 # When updating this, keep the version consistent with the changelog and the
 # value in lib/src/constants.dart.
-version: 6.1.0
+version: 6.1.1
 repository: https://github.com/dart-lang/tools/tree/main/pkgs/unified_analytics
 
 environment:
diff --git a/pkgs/unified_analytics/test/log_handler_test.dart b/pkgs/unified_analytics/test/log_handler_test.dart
index 76ae5e6..3cacf47 100644
--- a/pkgs/unified_analytics/test/log_handler_test.dart
+++ b/pkgs/unified_analytics/test/log_handler_test.dart
@@ -9,6 +9,7 @@
 
 import 'package:unified_analytics/src/constants.dart';
 import 'package:unified_analytics/src/enums.dart';
+import 'package:unified_analytics/src/log_handler.dart';
 import 'package:unified_analytics/src/utils.dart';
 import 'package:unified_analytics/unified_analytics.dart';
 
@@ -191,6 +192,26 @@
     expect(logFile.readAsLinesSync()[0].trim(), isNot('{{'));
   });
 
+  test(
+      'Catches and discards any FileSystemException raised from attempting '
+      'to write to the log file', () async {
+    final logFilePath = 'log.txt';
+    final fs = MemoryFileSystem.test(opHandle: (context, operation) {
+      if (context == logFilePath && operation == FileSystemOp.write) {
+        throw FileSystemException(
+          'writeFrom failed',
+          logFilePath,
+          const OSError('No space left on device', 28),
+        );
+      }
+    });
+    final logFile = fs.file(logFilePath);
+    logFile.createSync();
+    final logHandler = LogHandler(logFile: logFile);
+
+    logHandler.save(data: {});
+  });
+
   test('Catching cast errors for each log record silently', () async {
     // Write a json array to the log file which will cause
     // a cast error when parsing each line