mirror of
https://github.com/Xevion/paperless-mobile.git
synced 2025-12-14 22:12:18 -06:00
fix: Enable logging in production
This commit is contained in:
45
lib/features/logging/data/formatted_printer.dart
Normal file
45
lib/features/logging/data/formatted_printer.dart
Normal 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---"
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
116
lib/features/logging/data/logger.dart
Normal file
116
lib/features/logging/data/logger.dart
Normal 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,
|
||||
);
|
||||
}
|
||||
}
|
||||
52
lib/features/logging/data/mirrored_file_output.dart
Normal file
52
lib/features/logging/data/mirrored_file_output.dart
Normal 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,
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user