fix: Enable logging in production

This commit is contained in:
Anton Stubenbord
2023-10-19 18:26:02 +02:00
parent 7d1c0dffe4
commit 520bfbd7b1
104 changed files with 632 additions and 257 deletions

View File

@@ -0,0 +1,45 @@
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:logger/logger.dart';
import 'package:paperless_mobile/features/logging/models/formatted_log_message.dart';
class FormattedPrinter extends LogPrinter {
static final _timestampFormat = DateFormat("yyyy-MM-dd HH:mm:ss.SSS");
static const _mulitlineObjectEncoder = JsonEncoder.withIndent(null);
@override
List<String> log(LogEvent event) {
final unformattedMessage = event.message;
final formattedMessage = switch (unformattedMessage) {
FormattedLogMessage m => m.format(),
Iterable i => _mulitlineObjectEncoder
.convert(i)
.padLeft(FormattedLogMessage.maxLength),
Map m => _mulitlineObjectEncoder
.convert(m)
.padLeft(FormattedLogMessage.maxLength),
_ => unformattedMessage.toString().padLeft(FormattedLogMessage.maxLength),
};
final formattedLevel = event.level.name
.toUpperCase()
.padRight(Level.values.map((e) => e.name.length).max);
final formattedTimestamp = _timestampFormat.format(event.time);
return [
'$formattedTimestamp\t$formattedLevel --- $formattedMessage',
if (event.error != null) ...[
"---BEGIN ERROR---",
event.error.toString(),
"---END ERROR---",
],
if (event.stackTrace != null) ...[
"---BEGIN STACKTRACE---",
event.stackTrace.toString(),
"---END STACKTRACE---"
],
];
}
}

View File

@@ -0,0 +1,116 @@
import 'package:logger/logger.dart';
import 'package:paperless_mobile/features/logging/models/formatted_log_message.dart';
late Logger logger;
extension FormattedLoggerExtension on Logger {
void ft(
dynamic message, {
String className = '',
String methodName = '',
DateTime? time,
Object? error,
StackTrace? stackTrace,
}) {
final formattedMessage = FormattedLogMessage(
message,
className: className,
methodName: methodName,
);
log(
Level.trace,
formattedMessage,
time: time,
error: error,
stackTrace: stackTrace,
);
}
void fw(
dynamic message, {
String className = '',
String methodName = '',
DateTime? time,
Object? error,
StackTrace? stackTrace,
}) {
final formattedMessage = FormattedLogMessage(
message,
className: className,
methodName: methodName,
);
log(
Level.warning,
formattedMessage,
time: time,
error: error,
stackTrace: stackTrace,
);
}
void fd(
dynamic message, {
String className = '',
String methodName = '',
DateTime? time,
Object? error,
StackTrace? stackTrace,
}) {
final formattedMessage = FormattedLogMessage(
message,
className: className,
methodName: methodName,
);
log(
Level.debug,
formattedMessage,
time: time,
error: error,
stackTrace: stackTrace,
);
}
void fi(
dynamic message, {
String className = '',
String methodName = '',
DateTime? time,
Object? error,
StackTrace? stackTrace,
}) {
final formattedMessage = FormattedLogMessage(
message,
className: className,
methodName: methodName,
);
log(
Level.info,
formattedMessage,
time: time,
error: error,
stackTrace: stackTrace,
);
}
void fe(
dynamic message, {
String className = '',
String methodName = '',
DateTime? time,
Object? error,
StackTrace? stackTrace,
}) {
final formattedMessage = FormattedLogMessage(
message,
className: className,
methodName: methodName,
);
log(
Level.error,
formattedMessage,
time: time,
error: error,
stackTrace: stackTrace,
);
}
}

View File

@@ -0,0 +1,52 @@
import 'dart:async';
import 'dart:io';
import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:logger/logger.dart';
import 'package:paperless_mobile/core/service/file_service.dart';
import 'package:path/path.dart' as p;
import 'package:synchronized/synchronized.dart';
typedef f = FileOutput;
class MirroredFileOutput extends LogOutput {
var lock = Lock();
MirroredFileOutput();
late final File file;
@override
Future<void> init() async {
final today = DateFormat("yyyy-MM-dd").format(DateTime.now());
final logDir = FileService.instance.logDirectory;
file = File(p.join(logDir.path, '$today.log'));
debugPrint("Logging files to ${file.path}.");
try {
final oldLogs = await FileService.instance.getAllFiles(logDir);
if (oldLogs.length > 10) {
oldLogs
.sortedBy((file) => file.lastModifiedSync())
.reversed
.skip(10)
.forEach((log) => log.delete());
}
} catch (e) {
debugPrint("Failed to delete old logs...");
}
}
@override
void output(OutputEvent event) async {
await lock.synchronized(() async {
for (var line in event.lines) {
debugPrint(line);
await file.writeAsString(
"$line${Platform.lineTerminator}",
mode: FileMode.append,
);
}
});
}
}